using UnityEngine; namespace ServiceSim { /// /// 配膳ロボットの数字。ロボットに関する数字はすべてこの .asset に置く。 /// [CreateAssetMenu(menuName = "ServiceSim/Robot Spec", fileName = "RobotSpec")] public class RobotSpec : ScriptableObject { [Header("大きさ")] [Tooltip("直径(m)")] public float diameter = 0.5f; [Tooltip("高さ(m)")] public float height = 1.2f; [Header("走り")] [Tooltip("最高速度(m/秒)")] public float maxSpeed = 0.6f; [Tooltip("加速(m/秒^2)")] public float acceleration = 1.0f; [Tooltip("減速(m/秒^2)")] public float deceleration = 1.0f; [Tooltip("向きを変える速さ(度/秒)。仮の値には無かったので追加した")] public float turnSpeedDegPerSec = 180f; [Header("前のセンサー")] [Tooltip("進む向きの前、どこまで見るか(m)")] public float sensorRange = 0.6f; [Tooltip("センサーの幅(m)。ロボットの直径に合わせる")] public float sensorWidth = 0.5f; [Tooltip("センサーの高さ(m)")] public float sensorHeight = 1.2f; [Header("止まる・動き出す")] [Tooltip("前がこの秒数だけ空いたら動き出す(秒)")] public float resumeAfterClearSec = 1.0f; [Tooltip("止まってこの秒数たったら経路を引き直す(秒)")] public float replanAfterStoppedSec = 10f; [Tooltip("この秒数動けなかったら「動けなくなった」と記録する(秒)")] public float stuckAfterStoppedSec = 60f; [Tooltip("使っていない(v5 3章で、受け渡し口へ移すのをやめた)。" + "動けなくなったらスタッフを呼び、ServiceSpec.rescueSec(サイトの rescue_s)動かしてもらう")] public float stuckRecoveryWaitSec = 15f; [Tooltip("1往復がこの秒数を超えたら、受け渡し口へ置き直して往復を打ち切る(秒)。無限に止まらないための保険")] public float maxTripSec = 600f; [Header("通路の譲り合い")] [Tooltip("行き先の細い通路にもう1台のロボットがいたら、太い通路側の入口で待つ。場面2の撮影では切る")] public bool aisleYielding = true; [Header("台どうしの譲り合い(Unity だけの仮の値。サイトには無い)")] [Tooltip("入口で順番を待つ上限(秒)。これを過ぎたら譲らずに進む。" + "人がロボットを待つ上限(PeopleSpec.robotYieldMaxSec 20 秒)と同じ考え方")] public float aisleWaitMaxSec = 20f; [Tooltip("入口で待つとき、入口の点から通路の外へ下がる距離(m)。" + "入口の点そのものに立つと、中の台が出られなくなる")] public float aisleWaitSetbackM = 0.9f; [Tooltip("入口で待つとき、中の台が出てくる道をふさがないよう横へずれる距離(m)")] public float aisleWaitSideM = 0.6f; [Tooltip("もう1台にふさがれてから、譲り始めるまでの秒数(秒)。" + "すれ違うだけで譲り合わないよう、少し待ってから決める")] public float robotYieldAfterSec = 2f; [Tooltip("譲って下がったあと、相手を待つ上限(秒)。これを過ぎたら戻って進む")] public float robotYieldMaxSec = 20f; [Tooltip("相手が通り過ぎたとみなす、外周どうしの空き(m)")] public float robotYieldClearM = 0.6f; [Tooltip("下がる先が見つからないときに、その場から後ろへ下がる距離(m)")] public float robotYieldBackM = 0.9f; [Header("受け渡し口の前の通り方(Unity だけの決まり。サイトには無い)")] [Tooltip("戻る台が、受け渡し口の前の点を通らず、その少し下を通って右の待機場所へ抜けるか。" + "線が通れる床に乗らないときは、使わずに今までどおり受け渡し口の前へ戻る")] public bool useReturnLine = true; [Tooltip("戻りの線を、受け渡し口の前の点より何 m 下(−z)に通すか")] public float passReturnOffsetM = 1.0f; [Tooltip("戻りの線を、出ていく台の線(受け渡し口の前の点を通る線)から" + "中心どうしで何 m 以上離すか")] public float passReturnSeparationM = 1.0f; [Tooltip("戻りの線を、ドリンクバーの並ぶ点から何 m 以上離すか")] public float passReturnKeepAwayM = 0.6f; [Tooltip("戻りの線が通れる床に乗っているかを調べる刻み(m)")] public float passReturnCheckStepM = 0.05f; [Header("卓での止まり")] [Tooltip("卓に着いたら止まる秒数(秒)。客が料理を取る時間。「止まった」には数えない")] public float tableDwellSec = 25f; [Header("経路をたどる(仮の値には無かったので追加した)")] [Tooltip("行き先にこれだけ近づいたら着いたとみなす(m)")] public float arriveRadius = 0.25f; [Tooltip("経路の角にこれだけ近づいたら次の角へ進む(m)")] public float cornerReachDistance = 0.12f; [Tooltip("これより速度が小さければ「止まっている」とみなす(m/秒)")] public float stoppedSpeedEpsilon = 0.02f; [Header("止まったときに測る左右の空き")] [Tooltip("左右を見る高さ(m)。椅子(0.45 m)に当たる高さにする")] public float clearanceProbeHeight = 0.3f; [Tooltip("左右を見る距離(m)。これより遠いものは見ない")] public float clearanceProbeRange = 3.0f; [Tooltip("道が引けないとき、ふさいでいるものを探す半径(m)")] public float pathBlockSearchRadius = 2.0f; [Tooltip("NavMeshAgent の譲り合いの優先度。小さいほど譲らない。人より小さくして人がよけるようにする")] public int avoidancePriority = 0; [Tooltip("経路を引き直しても見つからないとき、次に試すまでの間(秒)")] public float repathRetrySec = 1.0f; [Header("途中までの経路から出る(B7)")] [Tooltip("止まっているあいだの「道が引けていなかった秒数(no_path_s)」がこれを超えたら、" + "repathRetrySec を待たずに強く引き直す(秒)")] public float noPathForceReplanSec = 10f; [Tooltip("強く引き直してもまだ途中までしか引けないとき、いちど通路の入口を目指して出る")] public bool escapeToAisleEntranceOnPartialPath = true; public float Radius { get { return diameter * 0.5f; } } [Header("道順(v5b・サイトから受け取る)")] [Tooltip("サイトの routes(曲がり角の点の並び)をたどるか。" + "外すと、今までどおり行き先まで Unity の道探しで直接行く(比べるとき用)")] public bool followSiteRoutes = true; [Tooltip("道順の点に着いたとみなす距離(m)。最後の点(止まる位置)だけは arriveRadius を使う")] public float waypointReachDistance = 0.25f; [Tooltip("道順の最後の点(止まる位置)を、焼いた面へ寄せるときに探す半径(m)。" + "サイトが通れる所に置いているので、寄せない(0.1 m 以下)。" + "この半径で面に乗らなければ広げて引き直し、報告に回数を出す")] public float routePointSnapM = 0.1f; } }