[UE4] 通过c++给AnimSequence添加FloatCurve

[UE4] 通过c++给AnimSequence添加FloatCurve

标签(空格分隔): UE4 unrealengine 虚幻引擎


因为项目需要,要在动画中记录很多跟动画相关的数据,UE4只能在动画编辑器界面手动给动画添加曲线,手动添加即不准确也太累了
所以写了个插件在Editor模式下提取动画数据进行计算(比如动画每一帧某个骨骼节点速度,如果在运行时处理的话太浪费性能了)然后把结果存在动画的曲线中,这样运行时直接去当前动画的曲线中取就行了,节省性能又方便

UE4支持FloatCurve 和 VectorCurve 下面写的是如何添加 FloatCurve 添加VectorCurve的流程基本一样

相关的API:

FloatCurve存在 AnimSequenceBase中的RawCurveData (类型:FRawCurveTracks)

struct FRawCurveTracks
{
    ...
    TArray FloatCurves //动画中带有的FloatCurve

    /**
     * 根据提供的UID创建新的曲线,如果创建成功则返回true
     * 如果bVectorInterpCurve == true, 则创建FVectorCuve, 否则创建的曲线是FFloatCurve
     */
    ENGINE_API bool AddCurveData(USkeleton::AnimCurveUID Uid, int32 CurveFlags = ACF_DefaultCurve, ESupportedCurveType SupportedCurveType = FloatType);

    //曲线类型CurveFlags参考AnimCurveTypes.h中的EAnimCurveFlags

    /**
    * 如果输入的UID没有对应的曲线的话,则创建一个新的曲线,否则则在输入的时间(Time)打上关键帧(Value)
    */
    ENGINE_API void AddFloatCurveKey(const USkeleton::AnimCurveUID Uid, int32 CurveFlags, float Time, float Value);
    ...

}

要在动画的USkeleton中的SmartNameContainer中为曲线创建一个新的Name
Skeleton.h :

// return bool - 输入的name是否已经存在 (如果已经存在则返回 false)
ENGINE_API bool AddSmartNameAndModify(FName ContainerName, FName NewName, FSmartNameMapping::UID& NewUid);
第一个参数 ContainerName 因为我们要创建的是动画曲线所以输入 USkeleton::AnimCurveMappingName, 
第二个参数是曲线的名字,
第三个参数返回名字对应的UID,

示例代码:

{
    FName CurveName = FName(TEXT("NewCurve"));

    USkeleton::AnimCurveUID CurveUid; //申明一个UID
    USkeleton* Skeleton = AnimSequence->GetSkeleton(); //从AnimSequence中获得骨骼对象
    if (Skeleton->AddSmartNameAndModify(USkeleton::AnimCurveMappingName, RootMotionCurveName, CurveUid))
    {
        AnimSequence->Modify(true);
        AnimSequence->RawCurveData.AddCurveData(CurveUid); //给这个AnimSequence添加曲线
        AnimSequence->MarkRawDataAsModified();//标记此AnimSequence为被编辑过,方便之后保存
    }

    if (Skeleton->GetSmartNameContainer(USkeleton::AnimCurveMappingName)->Exists(RootMotionCurveName))
    //检查我们的曲线是不是已经添加成功

    {
        //根据需求给动画曲线打关键帧
        int32 CurveFlag = ACF_Metadata;//我想将动画曲线类型设置为metadata(在编辑器中不能编辑,免得手滑点到关键帧了)
        float Time = 1.f;
        float Value = 0.5f;
        //随便设的值,在动画曲线1s的位置添加一个值为0.5的关键帧
        AnimSequence->Modify(true);
        AnimSequence->RawCurveData.AddFloatCurveKey(CurveUid, CurveFlag, Time, Value);//给曲线添加关键帧
        AnimSequence->MarkRawDataAsModified();
        UE_LOG(LogTemp, Warning, TEXT("Add FloatCurve Successful"));
    }
}

你可能感兴趣的:(UE4,虚幻引擎)