20241204 / Unity_6차 13주차 수요일
프로젝트 시작부터 갈팡질팡하던 NPC AI의 윤곽이 드디어 좀 잡힌 것 같다.
핵심은 NPC 직업(혹은 클래스)별 AI 스크립트인데,
아군의 경우 부랑자, 시민, 궁수 등의 AI, 그리고 몬스터의 경우 아직까지는 기본 몬스터의 AI 밖에 없다.
코드를 재활용하고는 싶은데(특히 State Machine), 직업마다 미묘한 차이 때문에 공통 부분을 만들기 쉽지 않다.
예를 들어 아군은 벽을 통과하는데 몬스터는 통과하지 못한다거나,
똑같이 달리는 상태더라도 목표 지점에 도착할 때까지 멈추지 말아야 하거나
중간에 타겟을 발견하면 멈춰야 한다거나 하는 상황 차이 등이 있다.
결국 직업 별 AI에 많은 기능이 집중되게 되었다.
그래도 시간은 많지 않으니 고급스럽게 코딩하기보단 일단 코드를 복붙해 놓고
나중에 리팩터링 한다던지 해야 겠다.
public abstract class HostileNPCAI : MonoBehaviour
{
public HostileNPC NPC { get; protected set; }
public HostileNPCAnimatorController AnimationController { get; protected set; }
public abstract bool Initialize(HostileNPC hodtileNPC);
public abstract void Destroy();
public abstract void UpdateAI();
}
public class AI_Grredling : HostileNPCAI
{
public enum Command
{
Wander,
Rush,
AttackTarget,
Attracted
}
public StateMachine_Grredling StateMachine { get; private set; }
public Command currentCommand { get; private set; }
public override bool Initialize(HostileNPC HostileNPC)
public override void Destroy()
public override void UpdateAI() // 최적화를 위해 부모 오브젝트 Update에서 호출
public void SetCommand_Wander(float left, float right)
private IEnumerator Execute_Wander(float left, float right)
public void SetCommand_Rush(float targetPosX)
private IEnumerator Execute_Rush(float targetPosX)
public void SetCommand_AttackTarget()
private IEnumerator Execute_AttackTarget()
public void SetCommand_Attracted(float position)
private IEnumerator Execute_Attracted(float position)
private GameObject DetectTarget()
private GameObject DetectItem()
}