요약
플레이어도 이동, 스킬, 정지상태를 관리하지만, 특수하게도 스킬에 종류가 존재한다. 그래서 스킬상태 이지만 기술 종류는 바뀌므로 상태가 안 바뀌어 원하는 스킬의 시작과 끝을 실행할 수 없다. 이를 수정하기 위해 스킬상태 안에 스킬 상태를 사용하는 방법을 고안하였다. 추후 클래스를 통해 변화하는 방식으로 바꾸는 것도 좋을 것 같다.
플레이어 상태 기계는 몬스터 처럼 상속될 때마다 상태에 대한 스크립트가 달라지지 않으므로 오히려 더 간결하다.
스킬 상태안에 스킬 종류 상태머신
이러한 복잡한 상황이 된 것은 설계단계에서 이동, 스킬, 정지와 같은 명확한 상태만을 인지하고 있고 스킬종류에 대한 것을 간과하여 발생한 일이다. 현재 플레이어 상태 기계는 GameManager에 State 열거형을 통해 상태를 정할 수 있다. 이는 앞서 말한 것처럼 단순 3개의 상태만이 존재할 것으로 생각하였기에 작성되었으며, 추후 이를 인지하고 클래스에 따른 변화로 바꾸고 싶었으나 너무 많은 곳에서 사용되어 이미 제거 불가라 생각하여 2개의 상태 기계를 만들었다. 이는 생각보다 나쁜 판단은 아니라 생각되며 어떤 면에서는 더 좋은 코드라 생각된다.
GameManager.cs
public enum State
{
Idle,
Move,
Skill
}
Player.cs
public class Player : MonoBehaviour
{
... 생략 ...
private void Update()
{
... 생략 ...
if (Instance.playerState == State.Idle)
{
playerStateMachine.TransitionTo(playerStateMachine.playerIdleState);
}
else if (Instance.playerState == State.Move)
{
if(MoveCount != 1)
{
playerStateMachine.TransitionTo(playerStateMachine.playerMovingState);
}
}
else if (Instance.playerState == State.Skill)
{
if (AttackCount != 1 || Instance.summonedSkill != null)
{
playerStateMachine.TransitionTo(playerStateMachine.playerSkillCastingState);
if (CurrentSkillState != Instance.skillState)
{
if(CurrentSkillState == null)
{
CurrentSkillState = Instance.skillState;
}
else
{
CurrentSkillState.Exit();
CurrentSkillState = Instance.skillState;
CurrentSkillState.Entry();
}
}
}
}
... 생략 ...
}
}
코드를 보면 상태 기계에 존재하는 상태 변환을 하고 있다. 이를 통해 스킬안에 기술 종류 상태를 바꿔주는 상태 기계를 가졌다.
PlayerStateMachine.cs
public class PlayerStateMachine
{
public IState CurrentState { get; private set; }
public PlayerSkillCastingState playerSkillCastingState;
public PlayerMovingState playerMovingState;
public PlayerIdleState playerIdleState;
public PlayerStateMachine(PlayerMovement playerMovement)
{
playerSkillCastingState = new PlayerSkillCastingState();
playerMovingState = new PlayerMovingState(playerMovement);
playerIdleState = new PlayerIdleState(playerMovement);
}
public void Initialize(IState startingState)
{
CurrentState = startingState;
startingState.Entry();
}
public void TransitionTo(IState nextState)
{
if (nextState == CurrentState) return;
CurrentState.Exit();
CurrentState = nextState;
nextState.Entry();
}
public void PlayerStateMachineUpdate()
{
if (CurrentState != null)
{
CurrentState.IStateUpdate();
}
}
}
플레이어 상태 기계는 몬스터 처럼 상속될 때마다 상태에 대한 스크립트가 달라지지 않으므로 오히려 더 간결하다.
'Unity > 로봇 체스 개발 일지' 카테고리의 다른 글
[Unity] 스킬 구현(2) : 데미지 판정, 스킬 알고리즘 (0) | 2025.01.13 |
---|---|
[Unity] 스킬 구현(1) : 표지판 디자인, 배치 알고리즘, Skill (0) | 2025.01.12 |
[Unity] 로봇 상태 관리(1) : Monster, MonsterStateMachine 구현 (0) | 2025.01.12 |
[Unity] 로봇 움직임 구현(3) : MonsterMovement 몬스터 동작 알고리즘 (0) | 2025.01.12 |
[Unity] 템플릿 메서드 패턴 : Action (0) | 2025.01.11 |