Unity 개발일지

[Unity] Invoke C# Events를 이용한 InputManager만들기 - 4 - 본문

Unity 개발

[Unity] Invoke C# Events를 이용한 InputManager만들기 - 4 -

아머르 2024. 6. 25. 21:46

Animator 창에서 Bool값으로 변수들을 선언 후 Create Sub-State Machine을 만들어주고 Ground라고 이름을 붙여준다.

 

그러면 Animator 상단에 Base Layer 와 Ground 로 레이어가 나뉘게 되는데 조건을 만족하면

Base Layer에서 Ground로 이동한다는 뜻이다.

 

Animation을 만들어줘야한다면 만들어서 넣어주고, 이미 만들어진 Animation이 있다면 드래그드랍으로 등록해주자.

 

Tsansition을 등록해주고 각각의 bool값 설정화 Has ExitTime을 해제해주는 등의 작업을 한다.

 

Player가 직접 움직이는게 아니라 붙어있는 Model이 움직여야하므로 Animator를 모델쪽으로 움직여준다.

Animator위치를 바꿔줬으니

Player 스크립트에 GetComponent로만 되어있다면 GetComponentInChildren으로 바꿔주자.

PlayerController 스크립트에도 Start로 정의되어있다면 OnEnable과의 호출순서를 고려 해 Awake로 옮겨주었다.

드디어 플레이어가 숨을쉰다!

 

이제 Player 입력값이 없기 때문에 Player Input처럼 입력값을 받기 위한 코드를 작성해주자.

 

<BaseState>에서 입력값에 대한 이벤트를 등록해준다.

AddInputActionsCallbacks 함수와 RemoveInputActionsCallbacks 함수를 작성해주고,

비워놨던 Enter과 Exit에 작성해준다.

AddInput과 RemoveInput은 BaseState에 들어왔을때와 나왔을 때 이벤트를 등록해주고 해제해준다.

이어서 OnRunStarted와 OnMovementCanceled 함수도 작성해준다.

이부분은 상속받은 곳에서 구체적으로 작성할 것이다.

 

이제 <PlayerGroundState>이다.

Ground상태에서 Movement가 Vector2.zero (입력이 없음) 상태이면 Idle상태므로 return,

반대로 움직이고 있다가(키를 입력하고있다가) 취소했을 때는 ChangeState를 해서 Idle로 돌아가게 해준다.

 

 

다음은 <PlayerIdleState>

Vector2.zero가 아니라는 뜻은 어떤 입력값이 들어왔다는 뜻이므로 움직이고 있다는 뜻일 것이다.

하지만 WalkState와 RunState를 아직 만들지않았따...

 

그렇지만!

이제 추가하는 방법은 간단하다.

각각의 State를 정의해주고 포함되는 Layer를 상속해준 후 기본생성자를 정의해준다.

 

그리고, PlayerStateMachine에서 사용하겠다고 정의해주면 된다!

 

<PlayerWalkState>를 마저 작성해주자

Enter와 Exit 했을 때 에니메이션을 재생, 정지 해주고, Enter에는 Idle에서 속도를 0으로 설정했기 때문에 MovementSpeedModifier를 groundData의 WalkSpeedModifier로 변경해준다.

Run이 시작 됬을 때 Run으로 State를 전환해주는 함수 OnRunStarted로 작성해준다.

 

<PlayerRunState>도 마찬가지

 

이렇게 작성하고 실행해보면! 잘 작동되는 것을 볼 수 있다.

 

추가로 Animation이 부자연스럽다면 Animator의 Animation을 클릭해서 Transition의 우선도를 조정해주자.

예를들어 Exit이 먼저라면 GroundState로 들어왔다가 다시 Idle을 거쳐 Walk로 오는 등

순서가 바뀌어 동작이 이상해질 수 있다.

 

여기까지 기본적인 FSM에 대해 배우고, 작성해보았다.

 

추후 해당프로젝트를 이용해서 시네머신을 이용해 시점을 설정하고,

공중에서와 동작하는 @Air와 콤보어택을 할 수 있는 @Attack도 구현해보려고 한다.

반응형