
결국 DELEGATE가 더 나을거같아서 DELEGATE로 처리하려다가 EVENT라는 기능이 있어서 이것도 써볼겸 EVENT로 구현하였다.
- PlayableCharacterBase에 DECLARE_EVENT 추가
- 바인딩하고 BroadCast할 Event 생성
- 기존 Move와 MoveEnd에 있던 OnMoveStateChanged함수 호출을 Event의 BroadCast 코드로 변경
EVENT를 통해 움직임을 멈췄을 때와 움직이는 동작때 함수를 호출 할 수 있다.
PlayableCharacterBase에 있던 함수
- OnMoveStateChanged ( 캐릭터 동작 검사해서 State 적용시켜주는 함수 )
- MovementModeChangedBind ( MovementModeChangedDelegate에 바인딩 해서 Walking, Falling 모드 변할 때 마다 함수 호출하도록 구현 할 함수 )
이 둘을 StateComponent에 옮겼다.
( OnMoveStateChanged -> StateCheck로 이름 변경 )
( StateCheck와 MovementModeChanged 함수 내용 )
1) StateComponent의 BeginPlay에서 MovementModeChangedDelegate에 MovementModeChangedBind 함수 바인딩
2) Character의 OnMoveEvent에 StateCheck함수 바인딩
( Event에 함수를 바인딩 할 때 멤버 함수의 경우는 AddUObject, UFUNCTION으로 선언한 함수는 AddUFunction을 사용한다고 한다. )
출처 - https://lykanstudio.tistory.com/52
이제 기존과 똑같이 동작하지만 Character에 코드 한 줄 추가없이 StateComponent를 추가하는 것 만으로 캐릭터의 동작에 따라 State를 구분, 적용 할 수 있게 완성되었다.
Tick 사용 없이 구현에 성공했다고 생각한다.
- Status 적용을 위한 Hp, Attack, Defense, Speed, Level 컴포넌트들 마저 만들기
- StateComponent 리팩토링 경험을 살려서 Character에 코드 추가하는 일 없게 제작하기