using System; using System.Linq; using BlueWaterProject.Type; using UnityEngine; using UnityEngine.AI; namespace BlueWaterProject { public class MotionSickState : INpcState { public event Action OnEnterAction; private NavMeshAgent agent; private InShipMapInfo inShipMapInfo; private bool isMovingToToilet; private Toilet targetToilet; public MotionSickState(NavMeshAgent agent, InShipMapInfo inShipMapInfo) { this.agent = agent; this.inShipMapInfo = inShipMapInfo; } public void OnEnter(NpcStateMachine npcStateMachine) { var toilets = inShipMapInfo.Toilets; // 화장실을 NPC와의 거리에 따라 정렬합니다. var sortedToilets = toilets.OrderBy(toilet => Vector3.Distance(agent.transform.position, toilet.transform.position)).ToList(); Toilet availableToilet = null; foreach (var toilet in sortedToilets) { // 사용 가능한 화장실을 찾습니다. if (!toilet.IsUsed) { availableToilet = toilet; break; } } // 사용 가능한 화장실이 있는 경우 if (availableToilet != null) { agent.SetDestination(availableToilet.transform.position); agent.stoppingDistance = 0; isMovingToToilet = true; targetToilet = availableToilet; agent.SetDestination(availableToilet.transform.position); agent.stoppingDistance = 0; } else { npcStateMachine.InstantiateObject(DataManager.Inst.vomit, npcStateMachine.transform.position); OnEnterAction?.Invoke(); npcStateMachine.RestorePreviousState(); } } public void OnUpdate(NpcStateMachine npcStateMachine) { // 화장실로 이동 중이라면 if (isMovingToToilet) { // 도착 여부 확인 if (agent.remainingDistance <= agent.stoppingDistance && !agent.pathPending) { // 도착했다면 화장실 사용 targetToilet.UseToilet(); OnEnterAction?.Invoke(); npcStateMachine.RestorePreviousState(); // 이동 상태 업데이트 isMovingToToilet = false; } } } public void OnExit(NpcStateMachine npcStateMachine) { } public INpcState Clone() { return null; } } }