UE엔진은 틱마다 입력 시스템 -> 게임 로직 -> 애니매이션 시스템 순으로 로직을 실행을 한다.
만약 애니매이션에서 앞서 실행되는 게임 로직 단계에서 폰을 제거하는 명령을 내린다면은 그 뒤어 실행되는 애니매이션 로직에서는 더 이상 유효하지 않은 폰 객체를 참조하게된다.
그래서 애니매이션 시스템은 폰에 접근할 때 먼저 폰객체가 유효한지 아닌지 점검해야하는데 이것을 해주는게
auto Pawn = TryGetPawnOwner(); TryGetPawnOwner함수이다.
AnimInstance에서 Character접근해서 속도 조절하는 방식도 있고
Character에서 animInstance에 접근을 해서 속도에 따라 애니매이션을 관리하는 방법도 있는데
대부분 전자의 방식을 사용을 한다.
애니매이션 로직과 폰 로직을 분리할 수 있기 때문에. (서버에서 문제없이 동작을 해서)
이전에 했던것들과 비슷하게
State를 만들어서 관리를 한다.
이 state는 다시
이렇게 되어있고, 각 트랜지션에다가
이런식으로 딱딱 연결되도록 했었음.
그리고 참고로
트랜지션의 Automatic뭐시기 이거 키면 애니매이션이 종료가 되면 다음 애니매이션 실행해주는 부분임.
캐릭터에 맞는 원하는 애니매이션이 없을 경우.
다른 스켈레톤 구성을 가진 캐릭터의 애니매이션 교환은 불가능하지만, UE는 인간형 캐릭터의 경우스켈레톤 구성이 달라도 애니매이션을 교환할 수 있도록 "애니매이션 리타깃" 기능을 제공함.
먼저, 원하는 애니매이션 드래그 후 아래처럼 우클릭 ㄱㄱ.
이거 누르고 폴더 위치 정해서 리타깃 하면 끝임. 굿굿.
애니매이션 블루프린트 클래스에서
몽타주 만들고
애니매이션 끌어다 놓고 끝시간 적절히 잘 맞춰주도록 하자.
그리고나서 AnimInstance클래스에서 이 몽타주 경로 긁어와서 특정키 입력시 플레이어가 일단 AniomInstance에 접근을해서 함수를 호출하여 재생하는 방식으로 구현을 할 것이다.
생성자에서 Object찾은다음에 PlayAttackMontage함수를 Character에서 호출을 할꺼임.
근데 이렇게 매번 체크를 하는것은 효율 안좋다. 그래서 Delegate를 사용을 할 것이다.
UE에서는 C++객체에만 사용할 수 있는 Delegate와 c++, blueprint객체가 모두 사용할 수 있는 Delegate로 나뉜다.
블루프린트 오브젝트는 멤버함수에 대한 정보를 저장하고 로딩하는 직렬화 메커니즘이 들어있기 때문에 일반 c++언어가관리하는 방법으로 멤버함수를 관리할 수 없다.
그래서 블루프린트와 관련된 c++함수는 모두 UFUNCTION메크로를 사용해야한다.
이렇게 블루프린트 객체와도 연동하는 delegate를 UE에서는 Dynamic Delegate라고한다.
이전에 했던 부분인데 기억이 난다.
여기에서 새 노티파이 생성해서 함수이름을
이렇게 똑같이 맞춰 주어야한다.
UE가 노티파이 호출되면 자동으로 애님 인스턴스의 AnimNotify_함수이름을 찾아서 호출하기 때문에.
애님 인스턴스에서 MULTICAST_DELEGATE 만들고 노티파이 설정해둔 부분에서 델레게이트 호출 할 수 있도록 만들어준다.
그리고 노티파이 울리면 BroadCast하여 Character에게 알려주고
Character에서 다시 필요한 정보들 셋팅해서 콤보를 구현하는 방식인데 이부분이 아직 안된다..
내생각에 Tool에서 뭔가 잘 못 설정한거 같기도 하다..
=> 강의처럼 내가 원하는대로 다시 구현을 해보도록 하자.