本文使用 UE4.26 版本,ActionRPG 教程为例,通过代码实现通过动画序列自动生成蒙太奇的功能。
包括:
- 批量通过动画生成对应蒙太奇(UE4 自带,但是需要改)
- 通过多个动画拼成一个蒙太奇,并设置对应的 Sections
一、功能背景
1.1 需求和场景
- 很多动画蒙太奇(AM)是直接通过动画序列(A),在 Content 目录下直接右键新建蒙太奇生成的,不需要有什么修改,理论应该可以批量生成
- 有些蒙太奇是通过多个 A 拼接而成,其中 Section 的位置以及名字都是固定的(位置和动画对齐,名字固定)
在这种情况下,程序直接批量生成,会大幅提升效率,并提升质量(只要保证动画没错,就不会出现策划配错了的情况),而且策划也懒得配。。
1.2 所需背景知识
只需要很基础的只是,就是蒙太奇上的 Section 和 Slot,以及 Segment 具体是什么,以及是干嘛用的。
UCLASS(config=Engine, hidecategories=(UObject, Length), MinimalAPI, BlueprintType)
class UAnimMontage : public UAnimCompositeBase
{
GENERATED_UCLASS_BODY()
// composite section.
UPROPERTY()
TArray<FCompositeSection> CompositeSections;
// slot data, each slot contains anim track
UPROPERTY()
TArray<struct FSlotAnimationTrack> SlotAnimTracks;
}
上边是蒙太奇类中,这篇文章中关心的两个成员: CompositeSections(简称 Sections)以及 SlotAnimTracks(简称 Slot,主要关心里边的 Segments)。
1.2.1 CompositeSections
下图中三个红框就是三个 Section,这个蒙太奇的 CompositeSections
大小就是 3。
Section 用来把动画分成多段。可以循环,可以跳过等等操作,如下,是技能中,直接跳到蒙太奇某一段的函数:
void UGameplayAbility::MontageJumpToSection(FName SectionName)
{
check(CurrentActorInfo);
UAbilitySystemComponent* const AbilitySystemComponent = GetAbilitySystemComponentFromActorInfo_Checked();
if (AbilitySystemComponent->IsAnimatingAbility(this))
{
AbilitySystemComponent->CurrentMontageJumpToSection(SectionName);
}
}
1.2.2 Slot 和 Segment
下图中,左边这个 Default.Default 是一个 Slot,即这个蒙太奇 SlotAnimTracks
大小是 1(一般就一个 Slot)。
USTRUCT()
struct FSlotAnimationTrack
{
GENERATED_USTRUCT_BODY()
UPROPERTY(EditAnywhere, Category