
새로 안 것
// 적 스탯 입력
[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;
}
인터페이스를 상속받는 클래스에서 통해
필수로 사용해야하는 메서드를 정의함.
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 상태 종료");
}
}