# ServiceSim 表示のルール

## 対象
Scene ビューに出す文字、store_report、Console。
CSV に書く値の言葉は対象外（過去の記録と比べられなくなるため。変えるときは対応表を作ってから別に行う）。

## 場所の名前
- 動かないものにだけ付ける：入口・風除室・待合・レジ・レジの内側・厨房・受け渡し口・返却口・パントリー・ドリンクバー・トイレ
- 待機の点には付けない（待機は吹き出しで表す）
- その場所の床の真ん中に固定する
- 文は場所の名前だけ。人数や状態は書かない
- 薄い白の背景（不透明度55%）＋1点の枠、10点、濃い灰の字、中央そろえ

## 吹き出し
- 動くもの（スタッフ・ロボット・客）にだけ付ける。椅子など動かないものには付けない
- 実際にいる位置に付いて動く
- 文は「誰×数 状態」。1つでも ×1 を付ける
  例：スタッフ×1 会計、ロボット×2 待機、客×3組 席待ち
- 数え方：スタッフとロボットは数、客は組
- 状態は1つだけ。いま何をしているかを書く。秒数・番号・行き先の卓は書かない
- 同じ場所で同じ状態のものは1つにまとめ、数で表す
- 濃い半透明の帯＋左端の色の帯、13点、白い字。左端の色は本体の色に合わせる

## 言葉（表に無い言い方は使わない）
| 意味 | 使う言葉 | 使わない言葉 |
|---|---|---|
| 店で働く人 | スタッフ | 店員 |
| 仕事がなく止まっている | 待機 | 待ち、パントリーで待つ |
| ロボットをよけて止まっている | ロボット待ち | 待つ |
| 席が空くのを待っている客 | 席待ち | 待合（状態には使わない。場所の名前だけ）、外で待つ |
| 店の外で席が空くのを待っている客 | 店外で席待ち | 外で待つ |
| 帰ってしまった客 | あきらめた | あきらめ |
| 料理を運ぶ仕事 | 配膳 | 料理、料理を運ぶ |
| ロボットが止まり、自分で動き出す | 一時停止 | 停止 |
| ロボットが動けず、人の助けが要る | 立ち往生 | 動けない |
| 客席の机 | 卓 | テーブル |
| レジの両側 | 客側／スタッフ側 | お客さん側、店員側 |

## 形と色で表す状態

見た目は、あとで天井の角のカメラの映像から人とロボットを見分ける学習に使う。
本物に近い形にするが、**測る数字は変えない**。見た目を足すときは、当たり判定（Collider）を
持たせない。NavMesh はコライダーの形で焼き、ロボットの前のセンサーもコライダーを見るので、
当たり判定さえ持たなければ、通れる床も卓までの道のりも変わらない。

### ベンチ
- **当たり判定の箱はそのまま**：大きさ・位置・高さ 1.1 m を変えない。NavMesh と
  前のセンサーはこの箱だけを見る。**見た目（Renderer）だけを消す**
- そのうえに、当たり判定を持たない見た目を2つ置く。どちらもベンチの箱の中に収め、
  **互いに重ねない**
    - **座面**：高さ 0.45 m（JSON の meta.heights.bench_seat）。背もたれの板を除いた部分
    - **背もたれ**：**机と反対側**のふちに薄く（0.08 m）、高さ 1.1 m
- 色と素材は、差し替えられるよう1か所にまとめる
    - 座面 Mat_BenchSeat ／ 背もたれ Mat_BenchBack
- 仕切り（Divider）は今までどおり、箱をそのまま見せる

### 立っている人（スタッフ・歩く客・待合の客）
- **形**：座っている客と同じ作りの「胴＋頭」にする
    - 胴：床から立ち上がるカプセル。半径は今までどおり 0.2 m
    - 頭：胴の上の球（半径 0.11 m）。頭の先が背の高さになる
- **背の高さは変えない**（PeopleSpec.personHeight 1.7 m）
- **色も変えない**：スタッフ 青（Mat_Staff）／歩く客 黄（Mat_Guest）／待合の客 紫（Mat_WaitingGuest）
- **取り替えるのは見た目（Renderer）だけ**。当たり判定（CapsuleCollider の半径・高さ・中心）、
  NavMeshAgent の半径と高さ、PersonBody、人がロボットをよける処理には触れない
- Tag も変えない（スタッフ SimStaff ／ 歩く客・待合の客 SimGuest）

### 座っている客
- **出す・消す**：客が席に着いたら、その席に「座っている客」の形を出す。立ち上がったら消す。
  ドリンクバー・トイレ・会計で立つときも消し、戻って座ったらまた出す。
  席にいる人数は「組の人数 − 立って歩いている人 − 会計に立っている人」
- **色**：立っている客と同じ黄色（Mat_Guest）
- **形**：座面（0.45 m）に腰かけて見えるように、胴と頭を分ける
    - 胴：座面の高さ 0.45 m から立ち上がる。半径は立っている客と同じ 0.2 m
    - 頭：胴の上に小さい球（半径 0.11 m）。**頭の先が背もたれ（1.1 m）より少し上に出る**
- **高さ 1.35 m**（頭の先。床から）：背もたれ 1.1 m より 0.25 m 高く、
  仕切り（1.2 m）よりも高いので、真上から見ても隠れない。
  立っている客（1.7 m）より低いので、座っていることが分かる。
  店の形の JSON（meta.heights）の高さを変えたら、この値も見直す
- **見た目だけ**：当たり判定（Collider）・PersonBody・NavMeshAgent を持たない。
  次のどれにも入れない（入れると止まる回数が変わり、計測が前と比べられなくなる）
    - NavMesh（コライダーの形で焼く。焼くのは店の下だけで、人は別の親の下に置く）
    - ロボットの前のセンサー（コライダーを見る）
    - 人がロボットをよける処理・人どうしの詰まりの記録・歩く人の数

### 種類の印（Layer / Tag）
- あとで映像から見分けるために、**Tag** を付ける。いまは付けるだけで、何にも使わない
    | もの | Tag |
    |---|---|
    | ロボット | SimRobot |
    | スタッフ | SimStaff |
    | 立っている客（歩く客・待合の客） | SimGuest |
    | 座っている客 | SimSeatedGuest |
    | ベンチ（当たりの箱・座面・背もたれ） | SimBench |
    | 机（卓の天板） | SimTable |
    | 椅子 | SimChair |
- Layer は使わない。Layer は物理の問い合わせに効くことがあるが、Tag は何にも効かないため
- Tag は ProjectSettings/TagManager.asset に増える（Assets/ServiceSim の外に出る唯一のもの）

## 床の色（2026-10-23 に決め直した）
- 床の色は **サイトの JSON から決める**（Unity の NavMesh の形からは決めない）。
  使っていない NavMesh の形を塗ると、ロボットが道順で入る細い通路が塗られず、
  「入れない」ように見えてしまうため
- **水色＝ロボットがふだん走る床**
  サイトの道順（routes）に沿って、ロボットの体（半径 0.25 m）が通る範囲。
  `use = narrow` の道も「床」として塗る
- **濃い水色＝細い通路（狭い道で入る）**
  店の形の `aisles` の区画（区画いっぱいが、体が通る範囲）。
  狭い道が狭いのは通路の中だけなので、通路の外まで濃い水色にはしない
  （そうすると⑦はほとんどの床が「細い通路」になる。水色 8.6 / 濃い水色 79.1 m2。
  　区画で分けると 水色 64.1 / 濃い水色 23.5 m2）
- どちらも、**ロボットの体が通る範囲いっぱいまで**塗る（道の中心線だけにしない）
- 置いてあるもの（壁・卓・椅子・ベンチ・カウンター・通れない部屋）の下は塗らない
- 2つが重なるところは、濃い水色（細い通路）を出す
- 凡例の言葉は「ロボットがふだん走る床」「細い通路（狭い道で入る）」
- 塗りは当たりを持たない板なので、NavMesh・前のセンサー・人がよける処理には入らない

## キッチンのモニター（2026-10-23。画面に貼り付けるパネルに変えた）
- **Scene ビューの画面に貼り付ける**パネル1つ。店の上に浮かべない
  （浮かべると通路やほかの札に重なるため）。
  カメラを回してもズームしても、**画面の上の位置は変わらない**
- 置き場所は、はじめは画面の**左上**。見出し「キッチンのモニター」を掴んで動かせる。
  動かした位置は次に Unity を開いたときも覚えておく（EditorPrefs）。
  画面の外に出たら、画面の中に戻す
- 見出しを押すと、たためる・開ける（たたんだときは見出しだけ）
- 字の大きさは、**場所の名前の札（「パントリー」など）と同じ**。文は左寄せの複数行
- 帯は、ほかの吹き出しと同じ濃い半透明。左端の色の線は付けない（2026-10-23 に外した）
- 出すもの（言葉と数字は**記録と同じもの**だけ。表に無い言い方は使わない）
    1. ロボット：台ごとに「仕事」と、止まっているときは「止まりの理由」
       （一時停止・立ち往生・通路の順番待ち・もう1台のロボット・通路の幅が足りない ほか）
    2. スタッフ：仕事ごとの人数（案内・配膳・呼び出し・会計・片付け・立ち往生・待機）
    3. **ロボット待ち**：いまロボットをよけて止まっている スタッフと客の**人数**
       （入口で待つ・通路の中で下がる の2つ。回り道は「回り道」として別に出す）。
       ここだけは客も**人数**で数える（立っている1人の状態なので。組では数えない）
    4. 店の様子：組（来た・席待ち・帰った）／受け渡し口の皿／
       逃がし弁（あきらめた・移した・卓を空けた）／立ち往生の回数
    5. **受け渡し口でロボットを待っている皿**：料理ができてから
       `robot_first_wait_s`（サイトの試算 v2.7 で 120 秒）のあいだは、ロボットだけが運ぶ。
       そのあいだ、まだ誰も持っていない皿の数。
       言葉と数字は記録と同じ（dishes.csv の `pass_wait_s`・`late_staff_pickup`、
       summary.json の `late_staff_dishes` と同じ皿を数えている）。
       はじめからスタッフも運べる皿（`fragile_by=staff` の倒れやすい料理・ロボット0台）は
       **数えない**（待つ決まりが当てはまらないため）
- 数え方はほかの札と同じ（スタッフとロボットは数、客は組）。
  ただし「ロボット待ち」だけは、上のとおり客も人数で数える
- **測る回でも出す**。頭の上の字幕は測る回では切る（B11）が、
  **このパネル1つだけは出す**
- 文を作り直すのは店の中の 0.5 秒ごと（毎コマ作らない）
- 切り替え：ExperimentPlan.showKitchenMonitor（1か所）
- 画面に貼り付けた表示なので、ほかの札の重なり避けには入れない
  （重なったらパネルを動かす）。カメラから書き出す画（top_*.png）にも写らない

## 人のよけ方の版（2026-10-23）
- 2つの版を切り替えで選ぶ。どちらで回したかを run_info に残す
    - **いまの版**（既定）：人は 20 秒まで待って、だめなら進む
    - **店員優先の版**：店員はロボットが通り過ぎるまで待つ（20 秒で諦めない）。
      ただし相手が別の理由で止まったまま 60 秒たったら、店員も回り道する（逃げ道・回数を記録）。
      客は長くて 5 秒止まり、そのあと回り道、無ければロボットの横を 10 cm まで詰めて通る
- 卓の前に止まっているロボット（配膳・下げ膳）も、人にとっては「よけて通る物」
- 立ち往生を助けに行く店員は、その台だけはよけない（前からの決まり）
- 5 秒・10 cm・60 秒と切り替えは PeopleSpec の1か所（「店員優先の版」の欄）

## 共通
- 描き方は1つ：Scene ビューの GUI（Handles.BeginGUI 内）。画面に正対し、ズームしても大きさが変わらない
- 床に寝かせた文字、画面の決まった位置に出す文字、凡例は使わない
- 重なり避けは全部で共用する。先に場所の名前、その上に吹き出し
- 計測の回では何も出さない。見る用の回と Build Store のあとは出す
- 新しい表示を足すときは、先にこのファイルを直してから作る
