127 lines
3.7 KiB
C#
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)
|
|
{
|
|
|
|
}
|
|
}
|
|
}
|