FSM - sunbang123/study_report GitHub Wiki

FSM μœ ν•œ μƒνƒœ 기계

  • 객체의 μƒνƒœλ₯Ό λ‚˜νƒ€λ‚΄κ³ , μƒνƒœμ— 따라 행동을 λ‹€λ₯΄κ²Œ μˆ˜ν–‰ν•˜λ„λ‘ 관리함.
  • 적 μΊλ¦­ν„°μ˜ AI(행동)μ œμ–΄μ— 많이 μ“°μž„.
  1. Idle(λŒ€κΈ°) μƒνƒœ
  2. Patrol(순찰) μƒνƒœ
  3. Attack(곡격) μƒνƒœ
  4. Dead(죽음) μƒνƒœ

μ˜ˆμ‹œ μ½”λ“œ

public interface IEnemyState
{
   void EnterState(EnemyFSM enemy);
   void UpdateState(EnemyFSM enemy);
   void ExitState(EnemyFSM enemy);
}

public IdleState : IEnemyState
{
   public void EnterState(EnemyFSM enemy)
   {
   }

   public void UpdateState(EnemyFSM enemy)
   {
       if(Time.time - enemy.StateEnterTime > 2f)
       {
           enemy.SwitchState(new PatrolState());
       }
   }
     // ...
}

public class EnemyFSM : MonoVehaviour
{
   public Movement2D movement2D;
   private IEnemyState currentState;
   public float StateEnterTime { get; private set; }
   public Vector3 MoveDirection { get; private set; }

    private void Awake()
    {
        movement2D = GetComponent<Movement2D>();
    }

    private void Start()
    {
        SwitchState(new IdleState());
    }

    private void Update()
    {
        currentState?.UpdateState(this);
    }
    
    public void SwitchState(IEnemyState newState)
    {
        currentState?.ExitState(this);
        currentState = newState;
        StateEnterTime = Time.time;
        currentState.EnterState(this);
    }   
     // ...
}


public enum Direction
{
   Up,
   Left,
   Right,
   Down,
   Count
}

βœ… μƒνƒœ(State)λ₯Ό 클래슀둜 λ‚˜λˆ„κ³ , μƒνƒœλ§ˆλ‹€ Enter/Update/Exit을 κ΅¬ν˜„ν•œλ‹€.

βœ… EnemyFSMμ—μ„œ ν˜„μž¬ μƒνƒœλ₯Ό κ΄€λ¦¬ν•˜λ©° μƒνƒœ μ „ν™˜(SwitchState)을 λ‹΄λ‹Ήν•œλ‹€.

βœ… Updateμ—μ„œ ν˜„μž¬ μƒνƒœμ˜ UpdateState()λ₯Ό ν˜ΈμΆœν•΄ μƒνƒœλ§ˆλ‹€ λ‹€λ₯΄κ²Œ ν–‰λ™ν•˜λ„λ‘ ν•œλ‹€.


  • FSM은 ν•˜λ“œμ½”λ”©λœ κ·œμΉ™ κΈ°λ°˜μž„. μƒνƒœλ₯Ό μ½”λ“œλ‘œ 직접 μ •μ˜ν•˜κ³  λ™μž‘κ΅¬ν˜„ν•œκ²ƒ.
  • λ”₯λŸ¬λ‹μ„ μ μš©μ‹œν‚¨λ‹€λ©΄?

λ”₯λŸ¬λ‹μ„ κ²Œμž„ AI에 적용

  • λ°μ΄ν„°μ—μ„œ νŒ¨ν„΄μ„ ν•™μŠ΅ν•˜λ„λ‘ λͺ¨λΈμ„ ν›ˆλ ¨μ‹œν‚΄

FSM κ·œμΉ™: λͺ¨λ“  μƒνƒœ μ „ν™˜ λ‘œμ§μ„ ν”„λ‘œκ·Έλž˜λ¨Έκ°€ 섀계

λ”₯λŸ¬λ‹ : 데이터λ₯Ό 보고 'ν”Œλ ˆμ΄μ–΄κ°€ κ·Όμ²˜μ— 있으면 곡격'같은 행동을 ν•™μŠ΅μ‹œν‚΄. μž…λ ₯(ν”Œλ ˆμ΄μ–΄ μœ„μΉ˜, 적 체λ ₯, μž₯μ• λ¬Ό μœ„μΉ˜)을 λ°›μ•„μ„œ 좜λ ₯(μ›€μ§μž„ λ°©ν–₯, μƒνƒœμ „ν™˜)을 예츑

ν•œλ§ˆλ””λ‘œ, FSM의 μƒνƒœμ „ν™˜μ„ λ”₯λŸ¬λ‹ λͺ¨λΈμ΄ κ²°μ •ν•˜κ²Œ ν•˜λŠ”κ²ƒμž„!

[λ”₯λŸ¬λ‹ λͺ¨λΈ]
  └─ μž…λ ₯: ν˜„μž¬ μƒνƒœ, μ£Όλ³€ 정보
  └─ 좜λ ₯: λ‹€μŒ μƒνƒœ 예츑
          예) Attack, Patrol, Idle

[EnemyFSM]
  └─ μƒνƒœ μ „ν™˜: λ”₯λŸ¬λ‹ λͺ¨λΈμ˜ 예츑 결과에 따라 μƒνƒœ μ „ν™˜
  └─ μƒνƒœ λ™μž‘: μƒνƒœ νŒ¨ν„΄ 기반으둜 μ½”λ”© (예: Move, Attack)
  • μŠ€νƒ μ˜ˆμ‹œ: Unity Barracuda(μœ λ‹ˆν‹°μ˜ ONNX λ”₯λŸ¬λ‹ λŸ°νƒ€μž„)

λͺ¨λΈ ν•™μŠ΅ 방법

  • 일반적으둜 Python + PyTorch/TensorFlow둜 ν•™μŠ΅ν•œ λ’€ λͺ¨λΈμ„ λ‚΄λ³΄λ‚΄μ„œ (ONNX λ“±) Unityμ—μ„œ Barracuda둜 λΆˆλŸ¬μ˜€λŠ” 식을 μ‚¬μš©ν•¨.

Pythonμ—μ„œ κ°•ν™”ν•™μŠ΅(예: PPO, DQN)으둜 적 행동을 ν•™μŠ΅.

λͺ¨λΈμ„ ONNX둜 export.

Unity Barracudaμ—μ„œ ONNX λͺ¨λΈ λ‘œλ“œ ν›„ 예츑.


λΉ„ μ „νˆ¬μƒν™©μ—μ„œ

  • κ²Œμž„ λ‚΄ μΆ”μ²œ μ‹œμŠ€ν…œ

예: νŠœν† λ¦¬μ–Ό 쀑에 ν”Œλ ˆμ΄μ–΄ μ‹€λ ₯에 맞좰 λ‚œμ΄λ„ μΆ”μ²œ.

ν”Œλ ˆμ΄μ–΄κ°€ μ–΄λ–€ λ¬΄κΈ°λ‚˜ 캐릭터λ₯Ό μ’‹μ•„ν• μ§€ 예츑.

ν”Œλ ˆμ΄μ–΄μ˜ 행동 νŒ¨ν„΄ 뢄석 β†’ β€œμ΄λŸ° μ•„μ΄ν…œμ„ μΆ”μ²œν•΄λ³ΌκΉŒ?β€λ‘œ μ—°κ²°.

⚠️ **GitHub.com Fallback** ⚠️