using System; using System.Linq; using PixelCrushers.DialogueSystem; using UnityEngine; using UnityEngine.AI; namespace BlueWaterProject { public class OrderToJailState : INpcState { private NavMeshAgent agent; private InShipMapInfo inShipMapInfo; private bool isMovingToJail; private Jail targetJail; private Transform npcTransform; public OrderToJailState(NavMeshAgent agent, InShipMapInfo inShipMapInfo, Transform npcTransform) { this.agent = agent; this.inShipMapInfo = inShipMapInfo; this.npcTransform = npcTransform; } public void OnEnter(NpcStateMachine npcStateMachine) { var jails = inShipMapInfo.Jails; var sortedJails = jails.OrderBy(jail => Vector3.Distance(agent.transform.position, jail.transform.position)).ToList(); Jail availableJail = null; foreach (var jail in sortedJails) { if (!jail.IsUsed) { availableJail = jail; break; } } if (availableJail != null) { agent.isStopped = true; isMovingToJail = true; targetJail = availableJail; agent.SetDestination(availableJail.transform.position + new Vector3(0,0,1)); agent.stoppingDistance = 0; agent.speed = 10f; targetJail.UseJail(); agent.isStopped = false; } else { //TODO 감옥이 없거나 꽉 찬 경우를 처리해야함 DialogueManager.Bark("NotJail", npcTransform); npcStateMachine.RestorePreviousState(); } } public void OnUpdate(NpcStateMachine npcStateMachine) { if (isMovingToJail) { if (agent.remainingDistance <= agent.stoppingDistance) { isMovingToJail = false; } } } public void OnExit(NpcStateMachine npcStateMachine) { agent.speed = 3.5f; } public INpcState Clone() { return null; } } }