일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 자료구조
- 코루틴
- LINQ
- 장애물달리기
- Generic
- 람다식
- script
- 프로그래머스
- 비선형자료구조
- 효과음
- 메서드
- BGM
- soundmanager
- ObjectPool
- 유한상태머신
- 유니티
- 직렬화
- 스파르타내일배움캠프
- c#
- inputsystem
- InputManager
- 배열
- 스택
- unity
- FSM
- delegate
- 인터페이스
- invokec#events
- skybox
- UI
- Today
- Total
Unity 개발일지
[Unity] Invoke C# Events를 이용한 InputManager만들기 - 3 - 본문
Scriptable 폴더를 만들고, <PlayerSO>를 작성해주자.
PlayerSO안에는 각 상태별 Data도 적어주었다.
스크립트 저장 후 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가 진짜로 움직이는 것을 확인해보겠다.
'Unity 개발' 카테고리의 다른 글
[Unity] 동적 생성을 해보자 (0) | 2024.06.26 |
---|---|
[Unity] Invoke C# Events를 이용한 InputManager만들기 - 4 - (0) | 2024.06.25 |
[Unity] Invoke C# Events를 이용한 InputManager만들기 - 2 - (0) | 2024.06.18 |
[Unity] Invoke C# Events를 이용한 InputManager만들기 - 1 - (2) | 2024.06.14 |
[Unity] Generic Singleton(제네릭 싱글톤) (2) | 2024.06.13 |