[ 개발 일기 ] FSM은 어렵다
2024. 5. 29. 16:00ㆍ게임 개발/개발 일기
근데 구조를 짜고 에디터를 짜서 Unity Graph view를 사용해 FSM을 사용하기 편하게 만드는 것은 어렵다.
Unity Graph View에 대해서는 찾아봐도 자료가 잘 안 나온다.
사실 자료는 나오긴 하는데 Unity 공식 문서거나, 2019년도 자료가 대부분이다. 유튜브 동영상을 하나 찾긴 했는데 코드로 설명하면 알아듣겠으나 영상에 대부분이 말로만 설명해 조금 더 찾아봐야할 것 같다.
그래도 프로젝트는 진행해야되니 일단은 Enum 형태로 디자인했다.
using System.Collections;
using System.Collections.Generic;
using UnityEditorInternal;
using UnityEngine;
public enum TempFSMDesignAIState
{
Idle,
TargetMove
}
public class TempFSM_Controller : FSM_Controller<TempFSMDesignAIState>
{
[Header("AI Info")]
[SerializeField]
private Transform _target;
[SerializeField]
private float _speed;
[SerializeField]
private float _delayTime;
[SerializeField]
private float _targetMoveTime;
protected override void FSM_AISetting()
{
// Idle
var idleState = new IdleState<TempFSMDesignAIState>(this);
var idleToMoveTransition = new FSM_Transition<TempFSMDesignAIState>(this, TempFSMDesignAIState.TargetMove);
DelayCondition delayCondition = new DelayCondition(_delayTime);
idleToMoveTransition.AddCondition(delayCondition);
idleState.AddTransition(idleToMoveTransition);
AddState(TempFSMDesignAIState.Idle, idleState);
// TargetMove
TargetMoveStateData data = new TargetMoveStateData(_target, _speed);
var targetMoveState = new TargetMoveState<TempFSMDesignAIState>(this, data);
var moveToIdleTransition = new FSM_Transition<TempFSMDesignAIState>(this, TempFSMDesignAIState.Idle);
DelayCondition targetMoveDelayCondition = new DelayCondition(_targetMoveTime);
moveToIdleTransition.AddCondition(targetMoveDelayCondition);
targetMoveState.AddTransition(moveToIdleTransition);
AddState(TempFSMDesignAIState.TargetMove, targetMoveState);
}
}
FSM_AISetting이라는 것을 무조건적으로 구현하게 만들어서 저 안에서 구조를 짜고 AddState를 추가해 실행하면 그대로 실행되도록 디자인했다.
참고로 _anyState라는 값도 상속된 얘들이 건들여서 트랜지션을 달아둘 수 있도록 제작했다.
이전에 프로젝트에서 사용하던 코드에서 FSM_AISetting이라는 AI구조 구현용 메서드를 추가하고 AnyState를 추가한 것 정도밖에 없긴 하다. + Debug 기능
이를 활용해 간단하게 구현한 Target을 3초 따라다니다가 1초 기다리는 AI이다.
'게임 개발 > 개발 일기' 카테고리의 다른 글
[ 개발 일기 ] Post Processing 내부 값 코드로 바꾸는 방법 (0) | 2024.06.13 |
---|---|
[ 개발 일기 ] Screen Space - Camera UI에 PP가 적용되지 않도록 하는 방법 (0) | 2024.06.12 |
[ 개발 일기 ] FSM 디자인 고민중.. (0) | 2024.05.28 |
[ 개발 일기 ] SO, Prefab을 에디터에서 저장하기 (0) | 2024.04.26 |
[ 개발 일기 ] Feedback Player 가지고 놀기 (0) | 2024.04.24 |