E4-Unreal / test-simple-game-framework

simpleFramework for UE 5.1.0
MIT License
0 stars 1 forks source link

언리얼 애니메이션 #48

Open Eu4ng opened 1 year ago

Eu4ng commented 1 year ago

링크된 애님 그래프 / 레이어

링크된 애님 그래프

Blueprint Thread Safe Update Animation

Now if we're running multiple functions in parallel, they have to be thread safe as each function runs on a separate thread of execution. But if we make sure that what we're doing here is thread safe then we have better performance. Because otherwise using multiple animation blueprints for a single character runs each of their event graphs one at a time and this can become a bottleneck. So here's how we can set all of these variables in our animation blueprints event graph in blueprint thread safe update animation instead to gain some performance and then once we go about using multiple animation blueprints all for the same character they'll be more optimized and we won't have bottlenecks

하나의 블루프린트 애니메이션을 사용하는 것이 아니라 여러 블루프린트 애니메이션을 링크하여 사용하기 때문에 스레딩을 사용한다.

링크된 애님 그래프 사용시 유의할 점

참고 링크

Eu4ng commented 1 year ago

버그

링크된 애님 레이어(셀프)로 설정되는 현상

링크된 애님 레이어(셀프)

image

링크된 애님 레이어

image

링크된 애님 레이어 > 디테일 > 인스턴스 클래스

구현된 인터페이스, 상속된 인터페이스가 반대로 설정되어 보이는 UI 버그가 있음 레이어를 다른 것으로 변경했다가 복구하면 인스턴스 클래스 편집 가능 상태로 바뀜

Eu4ng commented 1 year ago

애니메이션 템플릿

UE5에서 새로 출시된 기능이라고 한다. 스켈레탈 메시 종류와 상관없이 공통으로 사용할 수 있도록 하는 것이 핵심인 것 같다.

  • 링크된 애님 그래프로 호출 가능
  • 자손 애님 블루프린트 생성 가능

image

Eu4ng commented 1 year ago

링크된 애님 그래프

image

image

고찰

Locomotion과 같은 움직임들에만 사용하는 변수들과 AimOffset과 같은 상체 움직임들에서만 사용하는 변수들이 나뉘어져 있다면 첫 번째 그림과 같이 각각의 애님 링크 레이어에서 변수 값을 계산하고 사용하면 되겠지만, 동일한 변수 값을 사용한다면 베이스 애니메이션 블루프린트에서 변수 값을 계산해주어야 할 것이다.

Eu4ng commented 1 year ago

템플릿에서는 Velocity, GroundSpeed, ShouldMove, IsFalling 등 스켈레탈 메시와 관련없는 변수들이나 로직을 담당하고, 애니메이션 시퀀스, 블렌드 스페이스, 에임 오프셋과 같은 변수들은 링크된 애님 레이어에서 담당하는 것이 좋아보인다

  1. ABPT_Base
    • 링크된 애님 레이어
    • LowerBodyLocomotion
    • WeaponUpperBody
  2. ABPT_Locomotion
    • ABPT_Locomotion : 로직 담당
    • ABPT_LocomotionChild_Manny : 애니메이션 시퀀스, 블렌드 스페이스 할당
  3. ABPT_AimOffset
    • ABPT_AimOffset : 로직 담당
    • ABPT_AimOffsetChild_Manny : 에임 오프셋 할당

데이터 애셋으로 LowerBodyLocomotion, WeaponUpperBody에 링크할 애님 블루프린트 클래스 설정하는 것도 좋을 것 같다. 데이터 애셋 자체 기능으로 서로 다른 스켈레탈 메시인 것을 검사한다던가

Eu4ng commented 1 year ago

프로퍼티 액세스에 함수 바인딩을 위한 필수조건

반환 노드 이름 설정

image

image

블루프린트의 출력 노드를 C++에서 구현하면 void Test(int32& num) 이런 형태이다. 그런데 int32 Test() 형태의 경우에는 블루프린트의 출력 노드에서 출력 변수명을 설정할 수 없고 ReturnValue로 고정되어 있는데 이와 관련된 문제인 것 같다.

함수 설정

image

프로젝트 설정

image

참고 링크

Eu4ng commented 1 year ago

에임 오프셋의 에임 오프셋 블렌드 스페이스 바인딩 시 주의할 점

image

  1. 에임 오프셋 플레이어의 Blend Space를 변수화할 경우 AimOffset Blend Space가 아닌 일반 Blend Space로 만들어진다. 변수 타입을 변경해주어야 한다.
Eu4ng commented 1 year ago

애님 레이어 구현 시 변수 바인딩 방법

입력 포즈를 받는 레이어에서는 변수를 받아 사용하고, 입력 포즈가 없는 레이어에서는 프로퍼티 액세스로 하면 된다.

예시로 Locomotion은 입력 동작이 없으므로 프로퍼티 액세스를 통해 부모 애님 블프의 변수 값을 바인딩하고, AimOffset은 Locomotion의 동작을 입력으로 받기 때문에 프로퍼티 액세스가 아니라 인터페이스의 변수를 통해 값을 전달받는다.

이유는 모르겠지만 라이라 프로젝트에서 그렇게 사용중이며, AimOffset에서 프로퍼티 액세스를 하면 링크된 시점의 틱에서 None에 접근한다는 에러가 발생한다.

Base 애님 블루프린트

image

Locomotion 레이어

image

AimOffset 레이어

image

Eu4ng commented 1 year ago

image

초기화가 안 된 상태에서 AimOffset이 Base에 접근 못하는 것도 맞지만, Base 역시 아직 AimOffset을 Owning 하지 못해서 인터페이스단에서 그냥 무시된 느낌

Eu4ng commented 1 year ago

AnimationLayer