[ 개발 일기 ] 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이다.