OldBlueWater/BlueWater/Assets/02.Scripts/Npc/OrderToJailState.cs

80 lines
2.3 KiB
C#

using System;
using System.Linq;
using PixelCrushers.DialogueSystem;
using UnityEngine;
using UnityEngine.AI;
namespace BlueWaterProject
{
public class OrderToJailState : INpcState
{
private NavMeshAgent agent;
private InShipMapInfo inShipMapInfo;
private bool isMovingToJail;
private Jail targetJail;
private Transform npcTransform;
public OrderToJailState(NavMeshAgent agent, InShipMapInfo inShipMapInfo, Transform npcTransform)
{
this.agent = agent;
this.inShipMapInfo = inShipMapInfo;
this.npcTransform = npcTransform;
}
public void OnEnter(NpcStateMachine npcStateMachine)
{
var jails = inShipMapInfo.Jails;
var sortedJails = jails.OrderBy(jail => Vector3.Distance(agent.transform.position, jail.transform.position)).ToList();
Jail availableJail = null;
foreach (var jail in sortedJails)
{
if (!jail.IsUsed)
{
availableJail = jail;
break;
}
}
if (availableJail != null)
{
agent.isStopped = true;
isMovingToJail = true;
targetJail = availableJail;
agent.SetDestination(availableJail.transform.position + new Vector3(0,0,1));
agent.stoppingDistance = 0;
agent.speed = 10f;
agent.isStopped = false;
}
else
{
//TODO 감옥이 없거나 꽉 찬 경우를 처리해야함
DialogueManager.Bark("NotJail", npcTransform);
npcStateMachine.RestorePreviousState();
}
}
public void OnUpdate(NpcStateMachine npcStateMachine)
{
if (isMovingToJail)
{
if (agent.remainingDistance <= agent.stoppingDistance)
{
isMovingToJail = false;
targetJail.UseJail();
}
}
}
public void OnExit(NpcStateMachine npcStateMachine)
{
agent.speed = 3.5f;
}
public INpcState Clone()
{
return null;
}
}
}