using System.Collections.Generic; using UnityEngine; using UnityEngine.AI; // ReSharper disable once CheckNamespace namespace BlueWaterProject { public class FindTableState : INpcState { private TycoonNpc npc; private Table[] tables; public FindTableState(TycoonNpc npc) { this.npc = npc; tables = npc.MapInfo.Tables.GetComponentsInChildren(); } public void OnEnter(NpcStateMachine npcStateMachine) { CheckAndAssignSeat(); } public void OnUpdate(NpcStateMachine npcStateMachine) { UpdateTablesIfNecessary(); CheckAndUpdateTables(); if (npc.DoSeat && !npc.Agent.pathPending && npc.Agent.remainingDistance <= 0.5f) { npcStateMachine.ChangeState(new FoodOrderState(npc)); } } private void UpdateTablesIfNecessary() { var currentTables = npc.MapInfo.Tables.GetComponentsInChildren
(); if (currentTables.Length != tables.Length) { tables = currentTables; CheckAndAssignSeat(); } } private void CheckAndUpdateTables() { if (npc.DoSeat) return; foreach (var table in tables) { foreach (var seat in table.SeatPoints) { if (!seat.IsUsing) { AssignSeatToNpc(seat); return; } } } } private void AssignSeatToNpc(Seat seat) { npc.Agent.SetDestination(seat.transform.position); // if (npc.AssignedSeat != null) // { // npc.AssignedSeat.IsUsing = false; // npc.AssignedSeat.IsDirty = true; // } npc.AssignedSeat = seat; npc.AssignedSeat.IsUsing = true; npc.DoSeat = true; } private void CheckAndAssignSeat() { if (!npc.DoSeat) { // 확률 결정 var probability = Random.Range(0f, 1f); if (probability <= 0.7f) { // 70% 확률: 비어 있는 좌석 중에서 랜덤 선택 var availableSeats = new List(); foreach (var table in tables) { foreach (var seat in table.SeatPoints) { if (!seat.IsUsing) availableSeats.Add(seat); } } if (availableSeats.Count > 0) { var randomIndex = Random.Range(0, availableSeats.Count); AssignSeatToNpc(availableSeats[randomIndex]); return; } } else { // 30% 확률: 모든 좌석 중에서 랜덤 선택 var allSeats = new List(); foreach (var table in tables) { allSeats.AddRange(table.SeatPoints); } if (allSeats.Count > 0) { var randomIndex = Random.Range(0, allSeats.Count); AssignSeatToNpc(allSeats[randomIndex]); return; } } } } public void OnExit(NpcStateMachine npcStateMachine) { } } }