==================================================================== 依頼 v13 の 依頼2:店の時計と倍率の画面(SimHud)+1倍で回す 2026-10-26 12:41 check-in:ServiceSim/cs:12(保留 0) ==================================================================== 結論 ・画面の左上に「店の時計」と「**測った倍率**」を出す部品を作りました。 ・1倍で回す切り替えも付けました。1コマ 0.05 秒は**そのまま**で、 1コマの実時間が 0.05 秒になるまで**待つだけ**なので、中身の進み方は 1つも変わりません。 ・入切は2つとも SimHud の Inspector にあり、**初期値はどちらも切**です。 測る回(段階B・夜の60回など)の数字には効きません。 ・1倍で回した回は**見る専用**で、台帳の行も出力フォルダも作りません。 ・画面なしの実行では描かず、待ちもしません(夜の実行を遅くしません)。 ・check-in:**cs:12**(新しい 1 本・直した 3 本)。保留 0。 組み立て 56 本・エラー 0。確かめ 31 件+実際に動かした 11 件、ぜんぶ OK。 ==================================================================== 1. 作った・直したファイル ==================================================================== + Assets/ServiceSim/Store/SimHud.cs(新しい・240 行ほど) Inspector の項目(2つが本体) Show … 画面に出す(初期値 **切**) Real Time Speed … 1倍で回す(初期値 **切**) 細かい項目(ふだんは触らなくてよい) Measure Window Sec … 倍率を測る窓。既定 2 秒 Font Scale … 字の大きさ。画面の高さに対する割合。既定 0.028 Margin … 左上からの余白。既定 (16, 16) px Ops … 店の時計を読む先。Setup が入れる(空なら自分で探す) ・Assets/ServiceSim/Experiment/ExperimentRunner.cs 回し始めに SimHud を見て「見る専用(_viewOnly)」を決め、 WriteOutputs と det_frames の書き出しを止める ・Assets/ServiceSim/Editor/ServiceSimSetup.cs シーンに SimHud を置き、ops をつなぐ。 Show と Real Time Speed は**触らない**(エイイチが Inspector で決める) ・Assets/ServiceSim/Editor/ServiceSimStageB.cs 押す前の確かめに「1倍が入っていたら測る回は回せない」を1件足した 台帳の列・run_info.json の項目・店の回し方・ロボットと人の動きは 1つも変えていません(確かめ済み。4 章)。 ==================================================================== 2. 画面に出るもの ==================================================================== 左上に黒い半透明の帯で1行だけ出ます。 0:12:34 23.8 倍 店の時計 … 回し始めからの、**シミュレーションの中の**経過(時:分:秒)。 ServiceOps.NowS をそのまま読みます。 90 分の1回なら 0:00:00 → 1:30:00 まで進みます。 実物の動画の経過時間と並べて見る用です。 倍率 … **測った値**です。直近 2 秒ぶんの 「中の時間の進み ÷ 実時間の進み」。 決め打ちの数字ではないので、コマが重くなれば下がります。 1倍で回しているときは「1.0 倍(実時間)」と出ます。 ★ 実時間の測り方で1つ落とし穴がありました(直してあります) 最初は Time.unscaledDeltaTime で実時間を測っていました。これは誤りです。 Time.captureDeltaTime(= 0.05)を入れて回していると、Unity は deltaTime も unscaledDeltaTime も **その 0.05 に固定**するので、 何倍で回していても倍率が常に 1.0 に見えてしまいます。 実時間は Time.realtimeSinceStartup の差で測るように直しました。 ==================================================================== 3. 1倍で回す(中身の進み方は変えない) ==================================================================== やっていること void LateUpdate() { if (!RealTimeNow) return; float step = Time.captureDeltaTime; // 読むだけ(0.05) if (step <= 0f) return; float used = Time.realtimeSinceStartup - _frameRealStart; float wait = step - used; if (wait > 0f && wait < 1f) System.Threading.Thread.Sleep((int)(wait * 1000f)); _frameRealStart = Time.realtimeSinceStartup; } ・captureDeltaTime は **読むだけ**で、書き換えません(1コマ 0.05 秒のまま)。 ・timeScale も触りません。 ・LateUpdate なので、そのコマの計算が**ぜんぶ終わったあと**に待ちます。 待っている間は何も起きないので、「どの順で何が起きるか」は 1倍でも 20 倍でも同じです。 ・コマの計算が 0.05 秒より長くかかったときは待ちません(そのまま進む)。 その回は 1 倍より遅くなり、画面の倍率が 1.0 を下回って見えます (嘘をつかないので、録画で気づけます)。 ・待ちの細かさはミリ秒までです。1コマ 50 ミリ秒に対して十分で、 中の時間には影響しません(待ちは中の時間に入らないので)。 1倍で回した回は見る専用 ExperimentRunner.WriteOutputs(dir, …) _outputsWritten = true; if (_viewOnly) { ログだけ出して return; } ← ここで止まる なので台帳の行も、出力フォルダ(summary.json・trips.csv・timeline.csv など)も 作りません。Runner の中でフォルダを作る所は2か所しかなく (WriteOutputs と det_frames)、両方で止めてあります。 測る回は押す前に止まる 段階B・分かれの確かめ・夜の回などで 1倍 が入ったままだと、 記録が出ないまま時間を無駄にします。押す前の確かめに1件足しました。 ・SimHud の「1倍で回す」が入っています。その回は見る専用で 記録を書き出さないので、測る回は回せません。 シーンの SimHud で Real Time Speed を切ってください ==================================================================== 4. 測る回に影響しないことの確かめ ==================================================================== 決まりごと(コードで確かめた・4 本すべて) ① 初期値が切 show = false / realTimeSpeed = false ② Setup が触らない Setup には hud.show / hud.realTimeSpeed が無い (Inspector の値は Setup を押しても消えない) ③ 画面なしでは描かない・待たない CanDraw = !Application.isBatchMode && graphicsDeviceType != Null OnGUI は CanDraw が偽なら即 return RealTimeNow = realTimeSpeed && CanDraw → 夜の実行(-batchmode -nographics)では 入れてあっても 1倍 にならない ④ 店に書き込まない SimHud が代入するのは自分の覚えだけ。 店・ロボット・人のフィールドに1つも書かない ⑤ Unity の状態も触らない 触るのは Thread.Sleep 1 か所だけ。 captureDeltaTime・timeScale・物理の設定は触らない ⑥ 台帳と run_info は据え置き ServiceSimLedger は SchemaVersion = 2 のまま、 TripLogger にも項目を足していない Unity 抜きの確かめ:**31 件ぜんぶ OK** 時計の出し方・左上・倍率の式・実時間の測り方・初期値2つ・ Setup が触らない・batchmode・graphicsDeviceType・OnGUI の門・ RealTimeNow・LateUpdate の門・captureDeltaTime を書かない・ timeScale 無し・1コマ固定でないときは待たない・店に書かない・ Sleep は1か所・_viewOnly の立て方・WriteOutputs の門・ det_frames の門・フォルダを作るのは2か所だけ・押す前の確かめ2件・ Setup の作りと ops・ops が空でも探す・台帳の列・run_info の項目 実際に動かした確かめ(mono で SimHud を呼んだ):**11 件ぜんぶ OK** 時計 0 → 0:00:00/59.9 → 0:00:59/60 → 0:01:00/ 3599 → 0:59:59/3600 → 1:00:00/9045 → 2:30:45/ −5 → 0:00:00/5400 → 1:30:00(90 分の1回ぶん) 倍率 1コマ sim 0.05 秒 / 実 0.05 秒 → 1.00 倍 1コマ sim 0.05 秒 / 実 0.005 秒 → 10.00 倍 1コマ sim 0.05 秒 / 実 0.002 秒 → 25.00 倍 組み立て:56 本・エラー 0(Unity 抜き・同梱の csc) ==================================================================== 5. 使い方(録画のとき) ==================================================================== Unity を開き直すと、SimHud.cs の .meta が新しく1件 保留に出ます。 それは私が次の区切りで check-in します(中身の無いファイルなので そのまま入れて構いません)。 1. ServiceSim → Setup(シーンに SimHud が入ります。1回だけ) 2. Hierarchy の ServiceSim → SimHud を選ぶ 3. Inspector で Show を **入**(画面に時計と倍率を出す) Real Time Speed を **入**(1倍で回す。実物の動画と並べるとき) 4. Mac の画面録画(⌘⇧5)を始める 5. ふだんの回し方(Site Run など)で回す → この回は**見る専用**です。台帳にも書かず、出力フォルダも作りません → 段階B・夜の回は、1倍が入っていると押す前の確かめで止まります 6. 終わったら Real Time Speed と Show を **切**に戻す ★ 1倍の回は 90 分の中を 90 分かけて回します。 短い所だけ見たいときは、ExperimentPlan の回す長さを短くするか、 Real Time Speed を切って(倍率だけ見ながら)回してください。 Show だけ入れて速く回しても、数字には影響しません(③〜⑥のとおり)。 ★ 倍率は「いま出ている値」です。 実物の動画と秒数を比べるときは、**店の時計**を見てください。 倍率は「録画が何倍速で見えているか」の目安です。 ==================================================================== 6. 困る所・残したこと ==================================================================== ・1倍の待ちは Thread.Sleep です。macOS の眠りの精度は数ミリ秒ずれるので、 1コマが 0.050 秒ぴったりにはなりません(0.050〜0.052 秒あたり)。 90 分の回で実時間が数十秒ぶん長くなる向きですが、 **中の時間は 0.05 秒きざみのまま**なので、記録の数字は一切変わりません。 画面の倍率も測った値なので、そのずれがそのまま見えます。 ・Show を入れたまま測る回を回しても数字は変わりませんが、 OnGUI の描画ぶんだけ実時間は遅くなります(倍率が下がる)。 測る回は切のままにしておくのが無駄がありません。 ・字は Unity の既定のフォントです。日本語(「倍」)が出ます。 録画で小さければ Font Scale を上げてください。 既知として残しているもの(前の報告のまま、直していません) ・受け渡し口の点が1つしかないため、「切」でも2台が向かい合う件 (559 秒・体が重なる) ・来客の締め切りのずれ 9.3 秒 ・記録の中に時計が2つある件 ==================================================================== 7. 次(v12 の Unity の中の部分) ==================================================================== 依頼どおり、このあと v12 の 1〜3 章(画面なしの実行ファイル)に進みます。 1 章 Editor/BuildHeadless.cs(メニューとコマンドの両方から作れる) 出力 Builds/headless/ + build_info.json(VCS に入れない) 2 章 実行ファイルの引数(-ssCondition / -ssSeed / -ssLabel / -ssNight / -ssParallel / -ssPassBy / -ssTry)、終了コード 0・2・1、 書く前に KIOXIA を確かめる、run_info.json に runner・build_id・ night・parallel・seed を足す 3 章 台帳の鍵(C# 側)。今の追記のガードは残す 1つ決めておきたいこと(勝手に変えません) 出力フォルダの名前の中の cs の書き方です。 依頼 v12 の 2 章の例は `20261026_night_ss12_fam_p1_r1_s3`(ss12)ですが、 いま動いている段階Bと夜の実行係は `cs12` で揃えています (例 20261026_night_cs12_fam_p1_r1_s3)。 判定(judge_night.py)の glob も `cs` の形を見ています。 **このまま `cs` で揃えて進めます**。`ss` にしたいときは言ってください (tools/ の3本と判定も合わせて直します)。