====================================================================
依頼 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本と判定も合わせて直します）。
