들어가기 앞서
턴제시스템에 순서와 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구조가 있으면 코드의 복잡성은 기하급수적으로 증가하게된다 그래서 이후 유지보수성을 위해서라도 불필요한 복잡성을 제거함 |
마치며.
전체 턴제를 움직인다는건 모든 경우에 수에 대처가 가능한 상태가 되어야 한다는것을 깨달고 턴제만 가지고 갈때 다른 담당자들의 코드를 읽을일이 많게 된다는걸 알게되었을때 턴제시스템은 협업하기 힘든 기능이였다는걸 알게되어 다음에 만들땐 개인적으로 만들어봐야겠다고 생각하게 됨
'유니티개발 TIL' 카테고리의 다른 글
11주차 3일 TIL_유니티 실전 프로젝트(EventManager) (0) | 2025.09.11 |
---|---|
11주차 1일 TIL_유니티 실전 프로젝트(CommandManager, 턴제시스템 구상) (0) | 2025.09.09 |
11주차 1일 TIL_유니티 실전 프로젝트(프로젝트 구상) (0) | 2025.09.08 |
9주차 2일 TIL_유니티 입문(3D프로젝트_플레이어AI만들기) (0) | 2025.08.26 |
6주차 4일 TIL_유니티 입문(3D프로젝트_new InputSystem의 고찰) (6) | 2025.08.07 |