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

4 篇文章 0 订阅

工作时动画需要复用一些曲线用于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"
		});
	}
}

#include "AnimationModifiers/Public/AnimationBlueprintLibrary.h"
#include "AssetRegistry/AssetRegistryModule.h"
#include "Factories/CurveFactory.h"
#include "EditorLevelUtils.h"
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<UCurveFloat>();
        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;
}


//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
    评论
UE4中,导出人物动画有几个常用的方法。 第一个方法是使用FBX文件导出。首先,在3D建模软件(如Maya、Blender)中创建一个包含人物动画的模型,然后将其导出为FBX格式的文件。接下来,在UE4中创建一个新的角色蓝图,并将导入的人物模型添加到这个蓝图中。在动画编辑器中,选择人物的动画片段,并右键点击选择导出为FBX文件。在导出设置中,选择所需的设置,然后点击导出按钮即可生成FBX动画文件。 第二个方法是使用UE4内置的Sequencer导出。Sequencer是UE4中的一个可视化剧情编辑器,可以用于创建和编辑人物动画。首先,在角色蓝图中创建所需的动画序列,并在Sequencer中将动画序列添加到剧情中。然后,在Sequencer中选择要导出动画序列,并通过右键菜单选择导出为FBX文件。在导出设置中,选择所需的设置,然后点击导出按钮即可导出动画。 第三个方法是使用UE4的Persona编辑器导出。Persona是UE4中的动画编辑器,可以用于创建和编辑人物动画。在角色蓝图中选择需要导出动画片段,并打开Persona编辑器。在Persona编辑器中,选择要导出的骨骼动画,并通过右键菜单选择导出动画。在导出设置中,选择所需的设置,如动画格式、帧率等,然后点击导出按钮即可生成动画文件。 以上是几种常用的方法,用于在UE4导出人物动画。根据不同的需求和工作流程,可以选择适合的方法来导出动画

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值