c7~ 애니매이션

CJB_ny·2022년 12월 26일
0

득언리얼

목록 보기
3/12
post-thumbnail

c7 애니mation

UE엔진은 틱마다 입력 시스템 -> 게임 로직 -> 애니매이션 시스템 순으로 로직을 실행을 한다.

만약 애니매이션에서 앞서 실행되는 게임 로직 단계에서 폰을 제거하는 명령을 내린다면은 그 뒤어 실행되는 애니매이션 로직에서는 더 이상 유효하지 않은 폰 객체를 참조하게된다.

그래서 애니매이션 시스템은 폰에 접근할 때 먼저 폰객체가 유효한지 아닌지 점검해야하는데 이것을 해주는게

auto Pawn = TryGetPawnOwner(); TryGetPawnOwner함수이다.

1. 애니매이션 로직 분리 이유 👍

AnimInstance에서 Character접근해서 속도 조절하는 방식도 있고

Character에서 animInstance에 접근을 해서 속도에 따라 애니매이션을 관리하는 방법도 있는데

대부분 전자의 방식을 사용을 한다.

애니매이션 로직과 폰 로직을 분리할 수 있기 때문에. (서버에서 문제없이 동작을 해서)

2. 흐름 정리

이전에 했던것들과 비슷하게

State를 만들어서 관리를 한다.

이 state는 다시

이렇게 되어있고, 각 트랜지션에다가

이런식으로 딱딱 연결되도록 했었음.

그리고 참고로

트랜지션의 Automatic뭐시기 이거 키면 애니매이션이 종료가 되면 다음 애니매이션 실행해주는 부분임.

3. 애니매이션 리타겟 👍👍👍

캐릭터에 맞는 원하는 애니매이션이 없을 경우.

다른 스켈레톤 구성을 가진 캐릭터의 애니매이션 교환은 불가능하지만, UE는 인간형 캐릭터의 경우스켈레톤 구성이 달라도 애니매이션을 교환할 수 있도록 "애니매이션 리타깃" 기능을 제공함.

먼저, 원하는 애니매이션 드래그 후 아래처럼 우클릭 ㄱㄱ.

이거 누르고 폴더 위치 정해서 리타깃 하면 끝임. 굿굿.

c8 애니 시스템 활용

애니매이션 블루프린트 클래스에서

몽타주 만들고

애니매이션 끌어다 놓고 끝시간 적절히 잘 맞춰주도록 하자.

그리고나서 AnimInstance클래스에서 이 몽타주 경로 긁어와서 특정키 입력시 플레이어가 일단 AniomInstance에 접근을해서 함수를 호출하여 재생하는 방식으로 구현을 할 것이다.

생성자에서 Object찾은다음에 PlayAttackMontage함수를 Character에서 호출을 할꺼임.

근데 이렇게 매번 체크를 하는것은 효율 안좋다. 그래서 Delegate를 사용을 할 것이다.

Delegate

UE에서는 C++객체에만 사용할 수 있는 Delegate와 c++, blueprint객체가 모두 사용할 수 있는 Delegate로 나뉜다.

블루프린트 오브젝트는 멤버함수에 대한 정보를 저장하고 로딩하는 직렬화 메커니즘이 들어있기 때문에 일반 c++언어가관리하는 방법으로 멤버함수를 관리할 수 없다.
그래서 블루프린트와 관련된 c++함수는 모두 UFUNCTION메크로를 사용해야한다.

이렇게 블루프린트 객체와도 연동하는 delegate를 UE에서는 Dynamic Delegate라고한다.

델레게이트

Notify

이전에 했던 부분인데 기억이 난다.

여기에서 새 노티파이 생성해서 함수이름을

이렇게 똑같이 맞춰 주어야한다.

UE가 노티파이 호출되면 자동으로 애님 인스턴스의 AnimNotify_함수이름을 찾아서 호출하기 때문에.

콤보 공격 ❓❓❓❓❓

FMath::IsWithinInclusive

애님 인스턴스에서 MULTICAST_DELEGATE 만들고 노티파이 설정해둔 부분에서 델레게이트 호출 할 수 있도록 만들어준다.

그리고 노티파이 울리면 BroadCast하여 Character에게 알려주고

Character에서 다시 필요한 정보들 셋팅해서 콤보를 구현하는 방식인데 이부분이 아직 안된다..

내생각에 Tool에서 뭔가 잘 못 설정한거 같기도 하다..

=> 강의처럼 내가 원하는대로 다시 구현을 해보도록 하자.

profile
https://cjbworld.tistory.com/ <- 이사중

0개의 댓글