๋ฐ์ํ
๐ Unity ๋์์ธ ํจํด - ์ํ ํจํด(State Pattern) vs FSM
1. ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ๋ ๊ฐ์ง ๋ฐฉ์
๊ฒ์ ์บ๋ฆญํฐ์ ํ๋์ด๋ UI์ ์ ํ์ฒ๋ผ ์ํ์ ๋ฐ๋ผ ๋์์ด ๋ฌ๋ผ์ ธ์ผ ํ ๋, ์ฐ๋ฆฌ๋ ๋ค์ ๋ ๊ฐ์ง ์ ๊ทผ ๋ฐฉ์์ ๊ณ ๋ คํ๊ฒ ๋ฉ๋๋ค:
- FSM (Finite State Machine): ์ ํต์ ์ธ ์กฐ๊ฑด ๋ถ๊ธฐ ๊ธฐ๋ฐ ๊ตฌ์กฐ
- ์ํ ํจํด (State Pattern): ๊ฐ์ฒด์งํฅ ์์น์ ์ ์ฉํ ํ์ฅ ๊ฐ๋ฅํ ๊ตฌ์กฐ
2. FSM์ด๋?
FSM(Finite State Machine)์ ํ๋์ ์ํ๋ง ์ ์งํ๋ฉฐ, ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ค๋ฅธ ์ํ๋ก ์ ์ด๋๋ ๋ฐฉ์์ ๋๋ค.
๐ฆ ํน์ง
- enum, switch-case ๊ตฌ์กฐ๋ก ๋จ์ ๊ตฌํ ๊ฐ๋ฅ
- ๋น ๋ฅด๊ณ ์ง๊ด์ ์ธ ๋ก์ง ๊ตฌ์ฑ์ ์ ๋ฆฌ
โ ์์ ์ฝ๋ (Unity ๊ธฐ์ค)
public enum PlayerState { Idle, Move, Jump }
public class PlayerFSM : MonoBehaviour
{
private PlayerState state = PlayerState.Idle;
void Update()
{
switch (state)
{
case PlayerState.Idle:
if (Input.GetKeyDown(KeyCode.W))
state = PlayerState.Move;
break;
case PlayerState.Move:
if (Input.GetKeyDown(KeyCode.Space))
state = PlayerState.Jump;
break;
case PlayerState.Jump:
if (IsGrounded())
state = PlayerState.Idle;
break;
}
}
private bool IsGrounded() => true; // ์ฐฉ์ง ํ์ ์ ์๋ต
}
๐ ์ฅ์
- ๊ตฌํ์ด ๊ฐ๋จํ๋ค
- ๋ก์ง ํ๋ฆ์ด ๋์ ์ ๋ณด์ธ๋ค
๐ ๋จ์
- ์ํ๊ฐ ๋ง์์ง์๋ก switch ๋ฌธ์ด ๊ธธ์ด์ง
- ์ํ๋ณ ๋ก์ง์ด ์์ด๊ธฐ ์ฌ์ → ์ ์ง๋ณด์ ์ด๋ ค์
3. ์ํ ํจํด์ด๋?
์ํ ํจํด์ ๊ฐ ์ํ๋ฅผ ๋ ๋ฆฝ๋ ํด๋์ค๋ก ๋ถ๋ฆฌํ์ฌ, ์ํ ์ ํ๊ณผ ์คํ ๋ก์ง์ ์บก์ํํ๋ ๊ฐ์ฒด์งํฅ ๋ฐฉ์์ ๋๋ค.
๐ฆ ๊ตฌ์กฐ
- ๊ณตํต ์ธํฐํ์ด์ค IState
- ๊ฐ๊ฐ์ ์ํ ํด๋์ค (IdleState, MoveState, JumpState ๋ฑ)
- ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ์ปจํ ์คํธ (PlayerStateMachine ๋ฑ)
โ ์์ ์ฝ๋
public interface IState
{
void Enter();
void Execute();
void Exit();
}
public class IdleState : IState
{
public void Enter() => Debug.Log("Idle ์ง์
");
public void Execute() => Debug.Log("๋๊ธฐ ์ค...");
public void Exit() => Debug.Log("Idle ์ข
๋ฃ");
}
public class MoveState : IState
{
public void Enter() => Debug.Log("์ด๋ ์์");
public void Execute() => Debug.Log("์ด๋ ์ค...");
public void Exit() => Debug.Log("์ด๋ ์ข
๋ฃ");
}
public class PlayerStateMachine : MonoBehaviour
{
private IState currentState;
void Start()
{
ChangeState(new IdleState());
}
void Update()
{
currentState?.Execute();
// ์์ ์์ ์ ํ ๋ก์ง
if (Input.GetKeyDown(KeyCode.W)) ChangeState(new MoveState());
}
public void ChangeState(IState newState)
{
currentState?.Exit();
currentState = newState;
currentState.Enter();
}
}
๐ ์ฅ์
- ์ํ๋ณ ๋ก์ง์ด ๋ถ๋ฆฌ๋์ด ๊น๋ํจ
- ์๋ก์ด ์ํ๋ฅผ ํด๋์ค ์ถ๊ฐ๋ง์ผ๋ก ํ์ฅ ๊ฐ๋ฅ
- ์ํ ์ ์ด๊ฐ ๋ด๋ถ์ ์ผ๋ก ์ฒ๋ฆฌ๋์ด ์ ์ฐํจ
๐ ๋จ์
- ์ฒ์ ๊ตฌ์ฑํ ๋ ์ฝ๋ ์์ด ๋ง์ ๋ณด์
- ์์ ๊ท๋ชจ์ FSM์๋ ์คํ๋ ค ๊ณผํ ์ ์์
4. FSM vs ์ํ ํจํด ๋น๊ต
ํญ๋ชฉ | FSM | ์ํ ํจํด |
๊ตฌํ ๋์ด๋ | ๋ฎ์ | ์ค๊ฐ ์ด์ |
์ฝ๋ ๊ตฌ์กฐ | ์ ์ฐจ์ | ๊ฐ์ฒด์งํฅ์ |
ํ์ฅ์ฑ | ๋ฎ์ | ๋์ |
ํ ์คํธ ์ฉ์ด์ฑ | ๋ฎ์ | ๋์ |
๊ถ์ฅ ๋์ | ๊ฐ๋จํ ์ํ ์ ์ด | ์ํ๊ฐ ๋ง๊ฑฐ๋ ๋ณต์กํ ์์คํ |
โ ๋ง๋ฌด๋ฆฌ ํ ์ค ์์ฝ
FSM์ ๋น ๋ฅด๊ฒ ์์ํ ์ ์๋ ๋๊ตฌ, ์ํ ํจํด์ ๊ฒฌ๊ณ ํ ๊ตฌ์กฐ๋ฅผ ์ํ ์ค๊ณ์ ๋๋ค.
ํ๋กํ ํ์ → FSM → ๋ณต์กํด์ง์๋ก ์ํ ํจํด์ผ๋ก ๋ฆฌํฉํ ๋งํ๋ ํ๋ฆ์ด ์ด์์ ์ ๋๋ค.
๋ฐ์ํ
'C# > DesignPattern' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
DesignPattern - ์ ๋ต(Strategy) ํจํด (1) | 2025.08.06 |
---|---|
DesignPattern - ์ปค๋งจ๋(Command) ํจํด (0) | 2025.08.06 |
DesignPattern - ์ด๋ฒคํธ ๋ฒ์ค(Event Bus) ํจํด (0) | 2025.08.06 |
DesignPattern - ํฉํ ๋ฆฌ(Factory) ํจํด (1) | 2025.08.06 |
DesignPattern - ์ต์ ๋ฒ(Observer) ํจํด (0) | 2025.08.06 |