일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 게임프로그래밍패턴
- C++
- AI
- 복사생성자
- 게임 개발
- 언리얼
- 언리얼엔진5
- 프로그래밍
- CPP
- 데이터구조
- C언어
- 복사대입연산자
- 배열
- 생성자
- 언리얼엔진
- cpp개발
- effectivec++
- 포인터
- 디자인패턴
- 게임개발
- 언리얼 엔진5
- Unreal Engine5
- 소멸자
- 자료구조
- BehaviorTree
- 언리얼5
- 프로세스
- Unreal Engine
- Unreal
- UE5
Archives
- Today
- Total
리얼 개발
[UE5] 모션워핑과 풀바디 IK 본문
상황에 대응하는 프로시저럴 애니메이션 제작하기 | 언리얼 서밋 2021
https://www.youtube.com/watch?v=nxzfJcwyj1Y&t=856s
차례
- 모션 워핑
- 공격 스킬 구현
- 컨트롤 릭과 풀 바디 IK
- 풀 바디 IK 세팅
- 사다리 애니메이션 구현
모션 워핑과 풀 바디 IK는 아직 얼리엑세스 단계 - 영상 업로드 기준
모션 워핑
- 캐릭터의 루트 모션을 동적으로 타깃에 정렬
- 캐릭터를 원하는 타이밍 구간에 원하는 위치, 원하는 방향으로 캐릭터를 이동시켜주는 기능
- 루트 모션이라는 애니메이션을 보간해서 캐릭터를 이동시키는 방식
루트 모션
- 캐릭터의 최상위 노드의 애니메이션
- 애니메이션 파일의 루트 움직임을 캐릭터 무브먼트의 움직임으로 전환
- 캐릭터가 밀리는 현상을 방지하려면 디딤 발이 움직이지 않을 때, 루트도 움직이지 않게 한다.
💡 루트 모션 활성화 시켰을 때 루트 모션의 움직임이 멈췄었는데 사실 사라지는게 아니고 애니메이션의 루트 본 움직임을 고정시키는 대신에 캐릭터 무브먼트에 그 움직임을 전달한다.
대시 공격
대시 공격 구현
- 모션 워핑 컴포넌트 추가
- 적절한 공격 위치와 방향을 계산
- 싱크 포인트 업데이트
- 모션 워핑 노티파이 스테이트 설정
- 애니메이션 실행
C++ 구현
영상에서는 블루프린트를 사용해 구현하지만 나는 이를 C++로 구현해보기로 했다.
빌드에 모듈 추가
PublicDependencyModuleNames.AddRange(new string[] {"MotionWarping"});
캐릭터 클래스
헤더 파일
/* 모션 워핑 */
private:
UPROPERTY(EditAnywhere, Category = "MotionWarp")
TObjectPtr<class UMotionWarpingComponent> MotionWarpComponent;
구현 파일
#include "MotionWarpingComponent.h"
/* 컴포넌트 부착 */
MotionWarpComponent = CreateDefaultSubobject<UMotionWarpingComponent>(TEXT("MotionWarping"));
현재 제작중인 프로젝트에서는 기본 공격을 Component에서 관리하고 있다.
캐릭터 공격 컴포넌트
헤더 파일
/* 모션 워핑 컴포넌트 가져오는 함수 */
class UMotionWarpingComponent* GetMotionWarpComponent();
정의 파일
UMotionWarpingComponent* UCharacterAttackComponent::GetMotionWarpComponent()
{
return Character->GetComponentByClass<UMotionWarpingComponent>();
}
/* 모션 워핑 Target 업데이트 함수 */
void UCharacterAttackComponent::ProgressAttackMotionWarp()
{
const FVector PlayerLoc = Character->GetActorLocation();
const FVector TargetLoc = PlayerLoc + (Character->GetActorForwardVector() * 100.f);
const FRotator TargetRotator = UKismetMathLibrary::MakeRotFromX(TargetLoc);
GetMotionWarpComponent()->AddOrUpdateWarpTargetFromLocationAndRotation(TEXT("ProgressAttack"), TargetLoc, TargetRotator);
}
공격 몽타주에 모션 워핑 노티파이를 추가하고 Warp Target Name 을 설정해준 뒤, 해당 이름을 타겟으로 적어주면 된다. 마지막으로 몽타주가 실행되기 전 ProgressAttackMotionWarp 를 호출해준다.
주의할 점
- 모션 워핑을 적용하기 전 공격하면 캐릭터의 무브먼트를 MOVE_None이라 설정했었는데 모션 워핑으로 캐릭터를 움직이려면 해당 코드를 작성하면 안된다. 무브먼트를 이용해서 움직이기 때문에!
- 공격이 끝나면 캐릭터가 기울어졌었는데 Warp Rotation 을 false로 설정해주자.
컨트롤 릭
- 블루프린트 기반 리깅 시스템
- 프로시저럴 리깅
- 엔진에서의 애니메이션 키잉
- 리타기팅
- 풀 바디 IK
모션워핑 내용만 보려고 한거라 여기까지,,
'Unreal Engine5' 카테고리의 다른 글
[UE5] 데이터 테이블 (0) | 2025.03.02 |
---|---|
[UE5] AIPerception (1) | 2024.11.05 |
[UE5] 언리얼 빌드 시스템 (1) | 2024.09.12 |
[UE5] 무기 선택 창으로 무기 교체하기 (0) | 2024.09.11 |
[UE5] Vector 클래스 분석 (0) | 2024.09.04 |