OldBlueWater/BlueWater/Assets/02.Scripts/Npc/Guest/FindTableState.cs

127 lines
3.7 KiB
C#
Raw Normal View History

2024-04-07 05:56:58 +00:00
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
2024-01-02 08:17:10 +00:00
// ReSharper disable once CheckNamespace
namespace BlueWaterProject
{
public class FindTableState : INpcState
{
2024-01-02 08:17:10 +00:00
private TycoonNpc npc;
private Table[] tables;
2024-01-02 08:17:10 +00:00
public FindTableState(TycoonNpc npc)
{
2024-01-02 08:17:10 +00:00
this.npc = npc;
tables = npc.MapInfo.Tables.GetComponentsInChildren<Table>();
}
public void OnEnter(NpcStateMachine npcStateMachine)
{
CheckAndAssignSeat();
}
public void OnUpdate(NpcStateMachine npcStateMachine)
{
2024-01-02 08:17:10 +00:00
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>();
2023-12-28 06:49:30 +00:00
if (currentTables.Length != tables.Length)
{
tables = currentTables;
CheckAndAssignSeat();
}
2024-01-02 08:17:10 +00:00
}
private void CheckAndUpdateTables()
{
2024-01-16 18:26:40 +00:00
if (npc.DoSeat) return;
2024-01-02 08:17:10 +00:00
foreach (var table in tables)
2023-12-28 06:49:30 +00:00
{
2024-01-02 08:17:10 +00:00
foreach (var seat in table.SeatPoints)
{
if (!seat.IsUsing)
{
AssignSeatToNpc(seat);
return;
}
}
}
}
private void AssignSeatToNpc(Seat seat)
{
npc.Agent.SetDestination(seat.transform.position);
2024-01-16 18:26:40 +00:00
// if (npc.AssignedSeat != null)
// {
// npc.AssignedSeat.IsUsing = false;
// npc.AssignedSeat.IsDirty = true;
// }
2024-01-02 08:17:10 +00:00
npc.AssignedSeat = seat;
npc.AssignedSeat.IsUsing = true;
npc.DoSeat = true;
}
private void CheckAndAssignSeat()
{
2024-01-02 08:17:10 +00:00
if (!npc.DoSeat)
{
2024-04-07 05:56:58 +00:00
// 확률 결정
var probability = Random.Range(0f, 1f);
if (probability <= 0.7f)
{
2024-04-07 05:56:58 +00:00
// 70% 확률: 비어 있는 좌석 중에서 랜덤 선택
var availableSeats = new List<Seat>();
foreach (var table in tables)
{
2024-04-07 05:56:58 +00:00
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)
{
2023-12-28 06:49:30 +00:00
}
}
2024-01-02 08:17:10 +00:00
}