Unity 개발일지

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

Unity 개발

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

아머르 2024. 6. 19. 21:33

Scriptable 폴더를 만들고, <PlayerSO>를 작성해주자.

PlayerSO안에는 각 상태별 Data도 적어주었다.

지면에 있을 때의 Data인 GroundData
공중 상태일 때인 AirData
유니티 내에서 PlayerSO를 생성할 수 있는 CeateAssetMenu

스크립트 저장 후 PlayerSO를 생성해준 뒤 값은 스크립트에서 정한 값 그대로 두었다.

Player가 PlayerSO 데이터를 받아올 수 있도록 Player 스크립트를 수정해주었다.

PlayerSO를 드래그드롭해서 넣어주자.

 

이제 PlayerGroundState에 들어갈 State들을 본격적으로 작성해보자!@

일단, <PlayerStateMachine> 스크립트이다.

앞으로 상태들이 PlayerStateMachine을 거쳐갈텐데 상태들이 받아갈 수 있는 값들을 선언해주었다.

StateMachine을 추상클래스로 만들고, 이를 상속했는데 딱히 바꿀 내용은 없기 때문에 그대로 가져간다.

StateMachine이 계속 작동할 수 있도록 Player 스크립트에 PlayerStateMachine 변수를 선언해주고,

Update와 FixedUpdate에서 지속적으로 호출될 수 있도록 한다.

 

 

다음은 <PlayerBaseState> 스크립트를 작성한다.

 

BaseState는 IState 인터페이스를 상속하므로

Ctrl+. 을 눌러 필수구현항목들을 모두 구현해주자.

 

 

클래스 초기화를 해서 stateMachine을 받아오고, 변수로 선언해준 값들에 대입해준다.

 

FSM을 구현하다보면 얘는 어디서 온 변수명이지? 하고

당황스러울 때가 있는데 F12를 눌러서 타고타고 가다보면

이럴려고 이 변수를 만들었구나! 를 깨달을 수 있었다.

 

 

 

 

 

 

 

 

 

 

 

 

 

Hash값으로 저장해준 Animation들을 재생하고 멈출 수 있게 해주는 함수

 

여기서 눈여겨볼 것은 ReadMovementInptut 함수인데 CSharp Invoke를 통해 만들었던 PlayerInputs 스크립트PlayerActions에 등록되어있는 Move, Look등을 사용하는 것이다.

 

 

자! 이제 진짜진짜 마지막에 돌입해간다.

이 BaseState를 기준으로 이를 상속해 나머지 Sub-State들을 간단하게(?) 만들 수 있다.

PlayerBaseState생성자를 만들어준다.

Enter 시에 base.Enter() 후에 StartAnimation을 할 수 있도록 해준다.

GroundState에 Sub-State에 진입했다는 내용으로 AnimationData에 @Ground 해시값을 넘겨준다.

반대로 Exit에도 똑같이 Stop할 수 있도록 적용해줘 해당 State에서 나갈 수 있도록 해준다.

 

 

그다음은 IdleState

GroundState를 상속받으며 Ground State에 진입할 때 멈춰있으면 해당 애니메이션을 재생해준다.

멈춰있을때 재생하므로 base.Enter 전에 MovementSpeedModifier를 0으로 설정하고,

base.Enter 후에 Animation을 재생해준다.

 

이제 IdleState를 작성했으면 PlayerStateMachine이 IdleState를 들고있도록 바꿔줘야한다.

(해당 포스팅을 따라왔으면 먼저 작성해 둔 상태이다.)

PlayerStateMachine을 초기화 할 때 PlayerIdleState도 추가해준다.

 

Player스크립트에도 추가 변경사항을 등록해준다.

처음 Start 시 IdleState로 시작하게되는 것이다.

 

다음 포스팅에서는 Unity Scene 내에서 Animaton들을 등록해주고, Parameter값을 지정해서 Player가 진짜로 움직이는 것을 확인해보겠다.

반응형