[ Pattern ] Command Pattern(명령 패턴) in Unity C#

[ Programming Pattern 시리즈 ]
싱글턴 패턴 (Singleton Pattern) Link
컴포넌트 패턴 (Component Pattern) Link

커멘드 패턴 (Command Pattern) Link
관찰자 패턴 (Observer Pattern) Link
상태 패턴 (State Pattern) Link

 

%e1%84%89%e1%85%b3%e1%84%8f%e1%85%b3%e1%84%85%e1%85%b5%e1%86%ab%e1%84%89%e1%85%a3%e1%86%ba-2016-11-29-%e1%84%8b%e1%85%a9%e1%84%8c%e1%85%a5%e1%86%ab-11-02-12

Part 1.  Command Pattern

특정 버튼을 눌렀을 때, 점프를 하거나, 미사일을 쏘거나, 구르거나, 스킬을 발동시키는 일, 이런 코드는 게임에서 일상적이다.
그런 코드를 만들어라고 했을 때 가장 기본적으로 아래와 같은 코드가 나온다.

<Cube.cs>

그런데 갑자기 기획자가 다가오더니 아래와 같이 이야기 한다.

기획자 : 유저가 키를 바꾸고 싶을 때도 있을 것 같아요. 키와 동작을 유저 마음대로 바꾸게 지원해주세요~
개발자 : …

다양한 형태의 솔루션이 있을 수 있겠지만, 이럴 때 사용할 수 있는 패턴이 명령 패턴(Command Pattern)이다. GoF의 디자인 패턴 책에서의 Command Pattern 정의는 아래와 같다.

“요청 자체를 캡슐화하는 것입니다. 이를 통해 요청이 서로 다른 사용자를 매개 변수로 만들고, 요청을 대기시키거나 로깅하며, 되돌릴 수 있는 연산을 지원합니다”

아래는 키 변경이 유연하게 가능하기 위해서는 커맨드 패턴을 입힌 코드이다.

<Command.cs>

 

<Cube.cs>

그런데 위의 Command 클래스는 Jump, Fire, Roll, Skill의 주체가 동적이지 않고 고정되어 있는 한계가 있다.
즉, 특정 캐릭터만을 동작하게 하는 코드인데, 여러 캐릭터를 다 동작 가능하게 하려면 Action의 객체를 입력 값으로 받으면 좀 더 유연하게 만들 수 있다.

<Cube.cs>

 

<Command.cs>

이로써
1. 키 바인딩을 자유롭게 할 수 있고
2. 어떤 Actor라도 키로 인해서 컨트롤이 가능하게 된다.

커맨드 패턴을 통해서 조금 더 유연한 코드가 완성되었다.

———————————————————————–

Part 2.  Undo 기능

Command 패턴은 Undo 기능 같은 곳에서 적요하면 최적의 조합이 나온다. 아래는 Command 패턴을 이용해서 Unity에서 Undo 기능을 구현한 것이다.
“m” 키를 누르면 큐브가 이동하고, “u”키를 누르면 큐브의 이동이 Undo 된다.

<Cube.cs>

 

<Command.cs>

 

GitHub Link: Command Pattern in Unity Project