본문 바로가기
개발/Unity) 코드분석

코드분석) Commandpattern-Tutorial 프로젝트

by 테샤르 2022. 4. 12.

Commandpattern-Tutorial 프로젝트

Unity에서 Command Pattern을 사용한 프로젝트가 Learn Project가 있어서 코드 분석 및 학습 예제를 진행해보았다.

Command Pattern은 간단하게 

 

반응형

Unity learn Commant Pattern : [ 링크 ]

 

Command Pattern - Unity Learn

In this project, you will learn about the Command Pattern. You will then go onto setup your own implementation of the command pattern by programming an Undo function.

learn.unity.com

 

게임은 간단하게 체스처럼 Board에 유닛이 있고 상단의 Playing(Turn)마다 선택하면서 유닛을 이동시키는 간단한 Project이다.

------------------------------------

분석 내용

Command Pattern으로 Unit의 행동을 구현했다.

<CommandManager>

public class CommandManager : MonoBehaviour
{
    public interface ICommand
    {
        void Execute();
    }

    public static CommandManager Instance { get; private set; }

    private Stack<ICommand> m_CommandsBuffer = new Stack<ICommand>();

    private void Awake()
    {
        Instance = this;
    }

    public void AddCommand(ICommand command)
    {
        command.Execute();
        m_CommandsBuffer.Push(command);
    }
}

 

<UserController>

Update에서 상태와 Input에 대한 처리를 진행한다.

   void Update()
    {
        //We still have an animation underway, we can't interact yet.
        if(Gameboard.Instance.AnimationSystem.IsAnimating)
            return;
        
        switch (m_CurrentState)
        {
            case State.SelectingUnit:
                if (Input.GetMouseButtonUp(0))
                {
                    CheckUnitToSelect();
                }

                break;
            case State.MoveUnit:
                if (Input.GetMouseButtonUp(0))
                {
                    MoveUnit();
                }
                break;
        }
    }

<MoveCommand>

public class MoveCommand : CommandManager.ICommand
{
    private Vector3Int m_From;
    private Vector3Int m_To;

    public MoveCommand(Vector3Int start, Vector3Int end) 
    {
        m_From = start;
        m_To = end;
    }
    
    public void Execute()
    {
        var unit = Gameboard.Instance.GetUnit(m_From);
        if (unit != null)
        {
            Gameboard.Instance.MoveUnit(unit, m_To);
            Gameboard.Instance.SwitchTeam();
        }
    }
}

-----------------------------------

Unit을 기능을 확장하는 과정에서 Command Pattern을 사용해서 확장성 있게 처리한 코드였다.

Attack 기능을 구현을 한다는 가정 하에도 Move Command 구현 것을 참고해서 Execute에서 해당 공격에 대한 기능을 구현하면 된다.

확장성과 독립성이 유지가 되기 때문에 해당 구현 방식에 대해서는 참고하면 좋을 것 같다.

 

[Unity -Top Paid Package]

[Unity -Top Free Package]

[Unity -New Asset Package]

 

 

★★★☆

 

반응형

댓글