80 lines
2.3 KiB
C#
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;
|
||
|
}
|
||
|
}
|
||
|
}
|