[UE 4]c++でAnimSequenceにFloatCurveを追加


[UE 4]c++でAnimSequenceにFloatCurveを追加
ラベル(スペース区切り):UE 4 unrealengine幻エンジン
プロジェクトに必要なため、アニメーションに関連する多くのデータをアニメーションに記録するには、ユーザ機器UE 4はアニメーションエディタのインタフェースで手動でアニメーションにカーブを追加するしかありません.手動で追加するのは正確ではないので、プラグインを書いてEditorモードでアニメーションデータを抽出して計算します(例えば、アニメーションのフレームごとにボーンノードの速度があり、実行時に処理すると性能がもったいない)、結果をアニメーションの曲線に保存します.そうすると、実行時に現在のアニメーションの曲線から直接取ればいいので、性能を節約して便利です.
UE 4は、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のSmartName Containerでカーブに新しい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"));
    }
}