Unity 디자인 패턴 Command

2025. 5. 28. 20:26·유니티/Tutorial

커맨드 (Command) 패턴은 키 입력이나 마우스 입력과 같이 어떤 요청을 객체로 만들어 캡슐화시키는 패턴을 말합니다.

 

단순 요청만 전달하는 게 아니라 요청 자체를 객체로 만들어서 전달한다는 게 커맨드 패턴의 핵심입니다.

객체로 만들면 요청을 실시간으로 전달할 필요가 없어지고 요청 자체를 기록할 수 있게 됩니다.

 

CPU에서 GPU로 데이터를 넘겨주는 Command Buffer도 커맨드 패턴을 사용하는 걸로 알고 있고

게임에서는 주로 AI 행동, 입력 시스템, Undo/Redo 같은 기능에서 사용합니다.


 구현

 

저는 플레이어 Move를 예로 구현해 봤습니다.

 

ICommand

public interface ICommand
{
    void Execute();
    void Undo();
}

 

우선 상속할 인터페이스를 구현해 줍니다.

  • Execute : 요청 시 실행할 코드
  • Undo : 현재 실행한 커맨드 이전으로 되돌아가서 실행할 코드

Command 관리

public class CommandSystem
{
    private readonly Stack<ICommand> _commandHistory = new Stack<ICommand>();
    
    public void ExecuteCommand(ICommand command)
    {
        command.Execute();
        _commandHistory.Push(command);
    }

    public void UndoCommand()
    {
        if (_commandHistory.Count > 0)
        {
            var command = _commandHistory.Pop();
            command.Undo();
        }
    }
}

 

그다음은 커맨드들을 실행 및 되돌리기를 관리해 줄 코드를 작성합니다.

Stack은 Command을 담아 Undo 할 때 사용할 수 있습니다.

여기서 Push와 Execute는 따로 나눌 수 있습니다.


ICommand를 상속한 클래스

public class PlayerMoveCommand : ICommand
{
    private readonly Transform _playerTrans;
    private readonly Vector3 _direction;
    private Vector3 _prevPosition;

    public PlayerMoveCommand(Transform playerTrans, Vector3 direction)
    {
        _playerTrans = playerTrans;
        _direction = direction;
    }

    public void Execute()
    {
        _prevPosition = _playerTrans.position;
        _playerTrans.position += _direction;
    }

    public void Undo()
    {
        _playerTrans.position = _prevPosition;
    }
}

 

이제 ICommand를 상속받은 클래스를 만들어줍니다.

 

여기서 생성자를 통해 플레이어 위치와 방향을 지정해 주고 Execute를 통해 이전 위치를 넣어준 후 현재 플레이어의 Transform에 미리 지정한 방향을 더해줍니다.

만약 Undo를 실행하게 되면 현재 플레이어의 Transform에 prevPosition을 넣습니다.

 


실행

public class CommandPlayer : MonoBehaviour
{
    private readonly CommandSystem _commandSystem = new CommandSystem();
    private ICommand _playerMove;

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            _commandSystem.UndoCommand();            
        }
        
        if (Input.GetKeyDown(KeyCode.W))
        {
            _playerMove = new PlayerMoveCommand(transform, Vector3.forward);
            _commandSystem.ExecuteCommand(_playerMove);
        }
        else if (Input.GetKeyDown(KeyCode.S))
        {
            _playerMove = new PlayerMoveCommand(transform, Vector3.back);
            _commandSystem.ExecuteCommand(_playerMove);
        }
        else if (Input.GetKeyDown(KeyCode.A))
        {
            _playerMove = new PlayerMoveCommand(transform, Vector3.left);
            _commandSystem.ExecuteCommand(_playerMove);
        }
        else if (Input.GetKeyDown(KeyCode.D))
        {
            _playerMove = new PlayerMoveCommand(transform, Vector3.right);
            _commandSystem.ExecuteCommand(_playerMove);
        }
    }
}

 

마지막으로 WASD 키를 누를 때마다 인스턴스를 생성 후 해당 인스턴스를 Command System의 ExecuteCommand에 넣어 실행하게 됩니다. 스페이스 바를 누르면 Undo가 되어 이전 위치로 돌아가게 됩니다.


키를 누를 때마다 Stack에 쌓이고 Space를 누르면 Undo

 

'유니티 > Tutorial' 카테고리의 다른 글

Unity Fishnet[1] 네트워크 연결 및 플레이어 스폰  (2) 2025.06.30
Unity Fishnet[0] 소개 및 설치  (0) 2025.06.24
Unity 디자인 패턴 Observer  (0) 2025.04.25
Unity 디자인 패턴 Singleton  (0) 2025.04.07
Unity Compute Shader  (0) 2025.03.22
'유니티/Tutorial' 카테고리의 다른 글
  • Unity Fishnet[1] 네트워크 연결 및 플레이어 스폰
  • Unity Fishnet[0] 소개 및 설치
  • Unity 디자인 패턴 Observer
  • Unity 디자인 패턴 Singleton
어나더원
어나더원
경력 -1년 차 백수입니다. 취업하면 다시 글 올립니다.
  • 어나더원
    개발과 연구
    어나더원
    경력 -1년 차 백수입니다. 취업하면 다시 글 올립니다.
  • 전체
    오늘
    어제
    • 분류 전체보기 (21)
      • 유니티 (20)
        • Script (4)
        • Shader (1)
        • Tutorial (12)
        • Tip (3)
      • 컴퓨터 (1)
        • Window Error (1)
  • 공지사항

  • 인기 글

  • 태그

    Ai
    Blink
    blink effect
    compute shader
    fishnet
    FSM
    MCP
    Multiplayer
    Network
    Observer
  • 링크

  • hELLO· Designed By정상우.v4.10.3
  • 글쓰기  |  관리자
어나더원
Unity 디자인 패턴 Command
상단으로

티스토리툴바