• UE4 动画资源曲线导出以及导入


    工作时动画需要复用一些曲线用于morphtarget,遂做了一个对动画的曲线进行导入导出的工具

    // Fill out your copyright notice in the Description page of Project Settings.
    
    using UnrealBuildTool;
    
    public class MyProjectEditor : ModuleRules
    {
    	public MyProjectEditor(ReadOnlyTargetRules Target) : base(Target)
    	{
    		PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
    	
    		PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "MyProject"});
    
    		PrivateDependencyModuleNames.AddRange(new string[]
    		{
    			"AnimationModifiers", "AssetRegistry", "UnrealEd"
    		});
    	}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    #include "AnimationModifiers/Public/AnimationBlueprintLibrary.h"
    #include "AssetRegistry/AssetRegistryModule.h"
    #include "Factories/CurveFactory.h"
    #include "EditorLevelUtils.h"
    
    • 1
    • 2
    • 3
    • 4
    bool UFTBlueprintToolLibrary::ExportCurve(UAnimSequence* Seq, FName CurveName)
    {
        if (Seq == nullptr) return false;
        TArray<FName> CurveNames;
        UAnimationBlueprintLibrary::GetAnimationCurveNames(Seq, ERawCurveTrackTypes::RCT_Float, CurveNames);
        if (CurveNames.Find(CurveName) != -1)
        {
            //UCurveFloat* NewCurveResource = NewObject();
            TArray<float> Times;
            TArray<float> Values;
            UAnimationBlueprintLibrary::GetFloatKeys(Seq, CurveName, Times, Values);
            if (Times.Num() == Values.Num())
            {
    
                FAssetRegistryModule* const AssetRegistryModule = FModuleManager::Get().GetModulePtr<FAssetRegistryModule>("AssetRegistry");
                IAssetRegistry& AssetRegistry = AssetRegistryModule->Get();
    
                const auto CurveFactory = NewObject<UCurveFactory>();
                CurveFactory->CurveClass = UCurveFloat::StaticClass();
                FString CurveResName = "CF_" + CurveName.ToString();
                //remove illegal name
                CurveResName = CurveResName.Replace(TEXT(" "), TEXT(""));
                const FString PackageName = "/Game/" + CurveResName;
                UPackage* Package = CreatePackage(*PackageName);
                UObject* NewResource = CurveFactory->FactoryCreateNew(UCurveFactory::StaticClass(), Package, *CurveResName, RF_Standalone | RF_Public, nullptr, GWarn);
                //UAssetRegistryHelpers::CreateAssetData(NewCurveResource);
                //UAssetRegistryHelpers::GetAssetRegistry()->AssetCreated(NewCurveResource);
                auto* NewCurveResource = Cast<UCurveFloat>(NewResource);
                for (int i = 0; i < Times.Num(); ++i)
                    {
                        NewCurveResource->FloatCurve.AddKey(Times[i], Values[i]);
                    }
    
                AssetRegistry.AssetCreated(NewCurveResource);
                NewCurveResource->MarkPackageDirty();
                Package->SetDirtyFlag(true);
                NewCurveResource->PostEditChange();
                NewCurveResource->AddToRoot();
                return true;
            }
        }
        return false;
    }
    
    
    • 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
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    
    //MapRange true:Map Curve Length to Animation Length \false: truncation
    bool UFTBlueprintToolLibrary::ApplyCurve(UCurveFloat* Curve, UAnimSequence* Seq, FName CurveName, bool MapRange)
    {
    	if (Curve == nullptr || Seq == nullptr)
    	{
    		return  false;
    	}
    	UAnimationBlueprintLibrary::RemoveCurve(Seq, CurveName);
    	UAnimationBlueprintLibrary::AddCurve(Seq, CurveName);
    
    	TArray<float> Times;
    	TArray<float> Values;
    	float Range = 0;
    	if (MapRange)
    	{
    		float MinTime, MaxTime = 0;
    		Curve->FloatCurve.GetTimeRange(MinTime, MaxTime);
    		Range = MaxTime - MinTime;
    	}
    	for (int i = 0; i < Curve->FloatCurve.Keys.Num(); ++i)
    	{
    		float TempTime = Curve->FloatCurve.GetConstRefOfKeys()[i].Time;
    		if (MapRange)
    		{
    			TempTime = Seq->SequenceLength / Range * TempTime;
    		}
    		Times.Add(TempTime);
    		Values.Add(Curve->FloatCurve.GetConstRefOfKeys()[i].Value);
    	}
    	UAnimationBlueprintLibrary::AddFloatCurveKeys(Seq, CurveName, std::move(Times), std::move(Values));
    	Seq->MarkPackageDirty();
    	//Package->SetDirtyFlag(true);
    	return true;
    }
    
    • 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
    • 32
    • 33
    • 34
    • 35
  • 相关阅读:
    JavaWeb面经
    Windows 驱动开发 新手入门(四)
    LeetCode(cai鸟之路)139. 单词拆分
    Vben Admin 源码学习:项目初始化
    /system/bin/sh: disable-verity: not found
    【leetcode】往完全二叉树添加节点
    笑霸餐厅 | 瑞吉外卖项目 | 完整基础部分(后端学习笔记)
    【Linux】:初识git || centos下安装git || 创建本地仓库 || 配置本地仓库 || 认识工作区/暂存区(索引)以及版本库
    RHCE学习 --- 第六次作业
    spring import用法
  • 原文地址:https://blog.csdn.net/t1370620378/article/details/128199408