63.내일배움캠프 55일차 TIL <Unity 2D 팀프로젝트- MartialGod:Reborn - 4일차> 06/26

정광훈(Unity_9기)·2025년 6월 26일

TIL (Today I Learned)

목록 보기
64/110
post-thumbnail

새로 안 것

[field: SerializeField]

    // 적 스탯 입력
    [field: SerializeField] public MonsterStatus status { get; private set; } = new MonsterStatus();
    // 해당 적 오브젝트(Rigidbody2D) 할당
    [field: SerializeField] protected Rigidbody2D rigid { get; private set; }
    // 애니메이션 랜더러(애니메이터) 할당
    [field: SerializeField] protected Animator anim { get; private set; }


=> (람다 화살표):

식 본문(Expression-bodied) 구문을 나타내는 기호

메서드나 프로퍼티의 내용이 단 한 줄의 식(expression)으로 이루어져 있을 때,
중괄호 {}와 return 문을 생략하고 이 화살표로 대체하여 코드를 더 간결하게 만들 수 있다.

아래의 두 코드는 완전히 동일한 기능을 함.
두 번째 코드처럼 메서드나 프로퍼티 내용이 한 줄일 때 첫 번째 코드처럼 사용할 수 있음.

public BaseStateAi(MonsterBase _monsterBase) => monster = _monsterBase;

public BaseStateAi(MonsterBase _monsterBase)
{
    // 생성자 파라미터로 받은 _monsterBase 객체를
    // 클래스 멤버 변수인 monster에 할당합니다.
    this.monster = _monsterBase;
}

FSM

인터페이스를 상속받는 클래스에서 통해
필수로 사용해야하는 메서드를 정의함.

Awake()에서 현재 상태를 Idle상태로 지정함.

Idle, Walk, Run, Attack 상태에 따른 행동별로 상태 클래스로 정의.

그 클래스는 인터페이스를 상속하기 때문에 Enter(), Update(), Exit()를 사용해야함.

그 메서드들에 각자 맞는 행동을 기입하면 됨.

using System.Collections;
using UnityEngine;

public class FSM_Switch : MonoBehaviour
{
    // 상태 인터페이스 정의
    public interface IFSMState
    {
        void Enter(); // 상태 진입 시 1회 호출
        void Update(); // 매 프레임 호출
        void Exit(); // 상태 종료 시 1회 호출
    }
    
    private IFSMState currentState;

    void Awake()
    {
        ChangeState(new IdleState());
    }

    public void Update()
    {
        currentState?.Update();
        
        if (Input.GetKeyDown("1")) ChangeState(new IdleState());
        else if (Input.GetKeyDown("2")) ChangeState(new WalkState());
        else if (Input.GetKeyDown("3")) ChangeState(new RunState());
        else if (Input.GetKeyDown("4")) ChangeState(new AttackState());
    }

    private void ChangeState(IFSMState newState)
    {
        currentState?.Exit();
        currentState = newState;
        currentState.Enter();
    }

    // 상태 클래스 정의
    public class IdleState : IFSMState
    {
        public void Enter() => Debug.Log("상태 진입: Idle (비전투)");
        public void Update() => Debug.Log("Idle 상태 유지 중...");
        public void Exit() => Debug.Log("Idle 상태 종료");
    }

    public class WalkState : IFSMState
    {
        public void Enter() => Debug.Log("상태 진입: Walk (속도 2)");
        public void Update() => Debug.Log("Walk 상태 유지 중...");
        public void Exit() => Debug.Log("Walk 상태 종료");
    }

    public class RunState : IFSMState
    {
        public void Enter() => Debug.Log("상태 진입: Run (속도 5)");
        public void Update() => Debug.Log("Run 상태 유지 중...");
        public void Exit() => Debug.Log("Run 상태 종료");
    }

    public class AttackState : IFSMState
    {
        public void Enter() => Debug.Log("상태 진입: Attack (전투)");
        public void Update() => Debug.Log("Attack 상태 유지 중...");
        public void Exit() => Debug.Log("Attack 상태 종료");
    }
}

0개의 댓글