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;
}
}
}