커맨드 (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가 되어 이전 위치로 돌아가게 됩니다.

'유니티 > 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 |