일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- pdlc
- 게임 개발
- sampling theory
- DP
- DSP
- 운영체제
- Security
- RBAC
- ret2libc
- frequency-domain spectrum analysis
- MAC
- 유니티
- Unity #Indie Game
- MLFQ
- 게임개발
- 언리얼엔진
- 배경 그림
- Double free
- STCF
- dtft
- TSet
- 메카님
- dirty cow
- CTF
- 유스케이스
- AINCAA
- Rr
- Race condition
- stride
- linear difference equation
- Today
- Total
다양한 기록
[UE Game Framework] #4 Character Animation Setting 본문
[UE Game Framework] #4 Character Animation Setting
라구넹 2025. 1. 4. 17:52
클래스 생성 시 해당하는 클래스의 인스턴스를 생성해서 애니메이션을 관리시킴
이러한 애니메이션 시스템 -> 애니메이션 블루프린트
캐릭터의 애니메이션에 만들어져 있음
이러한 애니메이션 블루프린트가 전체적인 캐릭터의 모션을 담당
할 것: C++로 Anim Instance 만들고,
애니메이션 블루프린트가 생성한 C++ 클래스를 상속받아 구현하고,
Anim Graph를 사용해서 구체적인 모션을 설정
일단 클래스부터 만들기
애니메이션 블루프린트 만드는데 스켈레탈 메시 선택하고, 부모 클래스 선택
스켈레탈 메시 변경
AnimInstance도 바꿈
스켈레탈 메시는 확실히 바뀌었는데, 애니메이션은
시스템만 만들고 딱히 뭐 넣어준 거 없어서 저대로 둥둥 움직임
이제 애니메이션 블루프린트에서 설정해야 함
캐릭터 애니메이션 시스템의 생성
- 스켈레탈 메시 컴포넌트의 애니메이션 블루프린트 클래스를 지정
- 캐릭터가 초기화될 때 AnimInstance 클래스의 인스턴스를 생성
- 캐릭터는 GetAnimInstance 함수를 사용해 애니메이션 인스턴스를 얻을 수 있음
- 애니메이션 인스턴스는 GetOwningActor 함수를 사용해 자신을 소유한 액터 정보를 얻을 수 있음
캐릭터 애니메이션 시스템의 설계
- 애니메이션 블루프린트 = Event Graph + Anim Graph
- 이벤트 그래프에서는 이벤트로부터 상태를 파악할 수 있는 주요 변수를 저장
- NativeInitializeAnimation , NativeUpdateAnimation(프레임마다 발생) => GetOwningActor 발생
- 애님 그래프에서는 저장된 변수로부터 지정된 상태의 애니메이션을 제생
- 애님 그래프의 복잡한 상태는 State Alias로 분리하여 효과적으로 설계 가능
1. Event Graph
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "Animation/AnimInstance.h"
#include "ABAnimInstance.generated.h"
/**
*
*/
UCLASS()
class ARENABATTLE_API UABAnimInstance : public UAnimInstance
{
GENERATED_BODY()
public:
UABAnimInstance();
protected:
virtual void NativeInitializeAnimation() override;
virtual void NativeUpdateAnimation(float DeltaSeconds) override;
// 상속받은 블루프린트에선 읽기만 하도록
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Character)
TObjectPtr<class ACharacter> Owner;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Character)
TObjectPtr<class UCharacterMovementComponent> Movement;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Character)
FVector Velocity;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Character)
float GroundSpeed;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Character)
uint8 bIsIdle : 1;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Character)
float MovingThreshold;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Character)
uint8 bIsFalling : 1;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Character)
uint8 bIsJumping : 1;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Character)
float JumpingThreshold;
};
AnimInstance 헤더
// Fill out your copyright notice in the Description page of Project Settings.
#include "Animation/ABAnimInstance.h"
#include "GameFramework/Character.h"
#include "GameFramework/CharacterMovementComponent.h"
UABAnimInstance::UABAnimInstance()
{
MovingThreshold = 3.0f;
JumpingThreshold = 100.0f;
}
void UABAnimInstance::NativeInitializeAnimation()
{
Super::NativeInitializeAnimation();
//액터 타입으로 반환되어 캐릭터인지 알 수 없음
Owner = Cast<ACharacter>(GetOwningActor());
if ( Owner )
{
Movement = Owner->GetCharacterMovement();
}
}
void UABAnimInstance::NativeUpdateAnimation(float DeltaSeconds)
{
Super::NativeUpdateAnimation(DeltaSeconds);
if ( Movement )
{
Velocity = Movement->Velocity;
GroundSpeed = Velocity.Size2D();
bIsIdle = GroundSpeed < MovingThreshold;
bIsFalling = Movement->IsFalling();
bIsJumping = bIsFalling & ( Velocity.Z > JumpingThreshold );
}
}
AnimInstance 구현
기어 박스에서 상속받은 변수 확인하면 보임
저걸로 Anim Graph 설계
2. Anim Graph
저거에 걷기 뛰기 넣을 것 (Locomotion)
로코모션에서 구현할 애니메이션 지정해야 함
로코모션에 대한 구성을 다른 곳에서 진행하고 결과를 캐시로 저장해서 불러오는 방법 존재
애님 그래프에서 노드 추가하고
기본 상태랑 세가지 상태를 조합한 상태 만듦
Idle하지 않으면 Idle 에서 전이
Idle하면 Idle 상태가 되도록 함
이제 각 상태에 대한 모션을 지정해줘야 함
Idle은 이미 애셋 있으니 그냥 지정
근데 IdleWalkRun은 세가지 모션이 GroundSpeed에 따라 혼합되어 보여야 함
=> 애셋 추가 필요
블렌드 스페이스 1D
애니메이션 혼합 가능
연결까지 해줌
캐시로 저장 후
Locomotion에서 캐시를 가져다 씀
이제 잘 걷고 뜀
추가로 점프만 해주면 됨
앨리어스랑 각 스테이트 만들어주고
Locomotion에서만 넘어갈 수 있게 설정
다 설정하고
우선 순위 넣어줌
이러면 두가지 조건이 만족할 때 우선순위가 높은게 작동함
점프가 끝나면 폴링
점프 애니메이션이 10% 미만으로 남으면 폴링이 됨
착지 앨리어스 설정
착지를 해야 함
근데 랜드 모션은 로코 모션과 어우러져야 함
더해주고
조건은 폴링이 아닐 때로 설정
랜드 끝나면 로코모션으로 가도록 설정
플레이하면 잘 됨
이제 안쓰는 ThirdPersion 템플릿은 삭제
게임 모듈 베이스도 삭제해야 한다고 하는데, 내 프로젝트엔 애초에 없음
실행까지 잘 됨
'언리얼 엔진 > Unreal Game Framework' 카테고리의 다른 글
[UE Game Framework] #6 Character Attack Hit Check (0) | 2025.01.05 |
---|---|
[UE Game Framework] #5 Character Combo Action (0) | 2025.01.04 |
[UE Game Framework] #3 Character Control Setting (0) | 2025.01.03 |
[UE Game Framework] #2 Character & Input System (0) | 2025.01.03 |
[UE Game Framework] #1 기초 (0) | 2025.01.02 |