using UnityEditor; using UnityEditor.SceneManagement; using UnityEngine; using UnityEngine.SceneManagement; namespace ServiceSim.EditorTools { /// /// 座っている客の形(見た目だけ)を用意して、PeopleSpawner に入れる。 /// /// 10/21 に頼まれた「客が座っていることが画面で分かるように」が入っていなかったのは、 /// 出す・消す仕掛けはあったのに、その形の prefab /// (People/SeatedGuestBody.prefab)が一度も作られていなかったため。 /// 参照が空のとき SeatedGuest.ShowSeated が黙って戻るので、だれも気づけなかった。 /// /// 同じことが起きないように、 /// ・Build Store は毎回ここを通って用意し直す /// ・この1つだけを押せるメニューも置く(押した結果を Console に必ず出す) /// ・用意できなかったときは、SeatedGuest 側も警告を出す /// /// 形は当たり判定(Collider)・PersonBody・NavMeshAgent を持たない。 /// NavMesh(コライダーの形で焼く)・ロボットの前のセンサー(コライダーを見る)・ /// 人がよける処理(PersonBody を見る)のどれにも入らない。 /// public static class ServiceSimSeatedBody { [MenuItem("ServiceSim/座っている客の形を用意する", false, 22)] public static void EnsureFromMenu() { PeopleSpec spec = AssetDatabase.LoadAssetAtPath(ServiceSimSetup.PeopleSpecPath); if (spec == null) { Debug.LogError("[ServiceSim] PeopleSpec が見つかりません: " + ServiceSimSetup.PeopleSpecPath); return; } PeopleSpawner spawner = UnityEngine.Object.FindObjectOfType(); if (spawner == null) { Debug.LogError("[ServiceSim] シーンに PeopleSpawner がありません。" + "ServiceSim_Family シーンを開いてください"); return; } if (!Ensure(spawner, spec)) return; Debug.Log("[ServiceSim] 座っている客の形を用意しました" + "\n prefab: " + ServiceSimSetup.SeatedBodyPrefabPath + "\n 高さ " + spec.seatedBodyHeight.ToString("0.##") + " m(ベンチの箱 1.1 m・" + "仕切り 1.2 m より高く、立っている客 1.7 m より低い)" + "\n 色: 立っている客と同じ黄色(Mat_Guest)" + "\n 当たり判定・PersonBody・NavMeshAgent は持たない(見た目だけ)" + "\n このあと ServiceSim/Build Store を押すと、8 割の卓に座った客が出ます"); } /// /// 形の prefab を用意して PeopleSpawner に入れる。入れ替えたら true。 /// すでに同じものが入っていても true(用意できている、という意味)。 /// public static bool Ensure(PeopleSpawner spawner, PeopleSpec spec) { if (spawner == null || spec == null) return false; GameObject prefab = ServiceSimSetup.EnsureSeatedBodyPrefab(spec); if (prefab == null) { Debug.LogError("[ServiceSim] 座っている客の形(prefab)を作れませんでした: " + ServiceSimSetup.SeatedBodyPrefabPath); return false; } if (spawner.seatedBodyPrefab == prefab) return true; spawner.seatedBodyPrefab = prefab; EditorUtility.SetDirty(spawner); EditorSceneManager.MarkSceneDirty(SceneManager.GetActiveScene()); Debug.Log("[ServiceSim] PeopleSpawner に座っている客の形を入れました" + "(シーンを保存すると、回すときもこの形が出ます)"); return true; } } }