OldBlueWater/BlueWater/Assets/02.Scripts/Npc/Guest/FindTableState.cs
2024-04-07 14:56:58 +09:00

127 lines
3.7 KiB
C#

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<Table>();
}
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<Table>();
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<Seat>();
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<Seat>();
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)
{
}
}
}