왜.... 오셨나요?

부끄러워요

유니티개발 TIL

11주차 3일 TIL_유니티 실전 프로젝트(턴제시스템 연결(1))

와피했는데 2025. 9. 16. 20:34

들어가기 앞서

턴제시스템에 순서와 CommandPattern과 EventManager의 연결을 진행할 예정임


구현


이벤트 플레이어 행동 분기 선택

 

>이벤트로 하위 상태로 패턴 진행로직 

public enum EventType    // 이벤트 생길시 추가
{
    PlayerAction,
    PlayerAttack,
    PlayerKick,
    PlayerMove,
    EnemyTurnStart,
}

● EventManager로 State변환을 위해 이벤트등록

 

 private void OnEnable()	// 이벤트 등록
 {
     GameManager.Event.Subscribe(EventType.PlayerAction, HandleActionSelection);

 }

 private void OnDisable()// 이벤트 해제
 {
     GameManager.Event.Unsubscribe(EventType.PlayerAction, HandleActionSelection);
 }
 
     private void HandleActionSelection()	// 이벤트로 실행할 메서드
    {
        switch (turnHFSM.selectedAction)
        {
            case PlayerActionType.Move:
                ChangeTo<PlayerMoveState>();
                turnSettingValue.actionSelected = false;
                break;
            case PlayerActionType.Attack:
                ChangeTo<PlayerAttackState>();
                turnSettingValue.actionSelected = false;
                break;
            case PlayerActionType.Kick:
                ChangeTo<PlayerKickState>();
                turnSettingValue.actionSelected = false;
                break;
        }
    }

호출할 메서드가 있는 클래스에서 이벤트등록

    public void SetSelectedAction(PlayerActionType action)
    {
        turnHFSM.selectedAction = action;
        HandleActionSelection();
    }

TurnBasedManager에 플레이어 행동 분기에 따른 상태로 변환하도록 하는 메서드

 

    private void OnFire()
    {
        GameManager.TurnBased.SetSelectedAction(PlayerActionType.Attack); //어택상태로 진행
        fireBtnObj.Fire();
    }

  타클래스에서 함수 진행시 그에 맞는 행동으로 상태전환 하도록 이벤트 실행

 


버그수정


발생 CommandManager 제거
문제 여러 부분에서 다른 스크립트들과의 연결구조를 테스트한 결과 EventManager와 HFSM에 사용할때 다른 컨트롤 관련 담당자와 협업시 command사용은 복잡한 구조와 불필요한 연결구조를 보인다 
해결 그래서 Hfsm에 메서드 직접호출 또는 이벤트를 통한 간접 호출로써 컨트롤 메서드와 연관성을 고려해보려고 한다 또한 UI상호작용을 더한다면 command구조가 있으면 코드의 복잡성은 기하급수적으로 증가하게된다 그래서 이후 유지보수성을 위해서라도 불필요한 복잡성을 제거함


마치며.


전체 턴제를 움직인다는건 모든 경우에 수에 대처가 가능한 상태가 되어야 한다는것을 깨달고 턴제만 가지고 갈때 다른 담당자들의 코드를 읽을일이 많게 된다는걸 알게되었을때 턴제시스템은 협업하기 힘든 기능이였다는걸 알게되어 다음에 만들땐 개인적으로 만들어봐야겠다고 생각하게 됨