Creating and using a blendspace in c++
转自:https://forums.unrealengine.com/development-discussion/c-gameplay-programming/104831-creating-and-using-a-blendspace-in-c
creating and using a blendspace in c++
i'm trying to automatize the animation of (a lot of) pawns and would like not to have to define ~100 blendspaces and animblueprint by hand in the editor.
If i can get it to work, i'll just have to create blueprints inheriting from this class and set the skeletal mesh and animations.
This subject seems to pop up every now and then, there are a few post on the answerhub, and even a wiki by Rama, but all of them seem to assume that the BlendSpace is created in the editor.
As you can see, i'm trying several methods (via the skeletal mesh component and the anim instance) to animate the mesh with the blendspace, none of them works so far.
I tried everything i could find related to animation and blendspace in the api documentation.
I can spawn the blueprint, but the mesh remains static so obviously i miss something.
I tried to set this in the blueprint, and i can see the debuging flow correctly going through everything.
I can't check visually the blendspace, so i'm a bit lost and dry now.
Here's the code:
void AYagPawn::BeginPlay()
{
Super::BeginPlay(); [...] // creating the BS (SMC_00 is a USkeletalMeshComponent)
ThisBlendSpace1D = NewObject<UBlendSpace1D>(this, UBlendSpace1D::StaticClass());
ThisBlendSpace1D->SetSkeleton(SMC_00->SkeletalMesh->Skeleton); // setting a parameter for the BS
FBlendParameter BP_Speed;
BP_Speed.DisplayName = "Speed";
BP_Speed.GridNum = ;
BP_Speed.Min = .f;
BP_Speed.Max = .f;
ThisBlendSpace1D->UpdateParameter(, BP_Speed); // adding two sample (at 0 and 100)
// IdleSequence and MoveSequence are UAnimSequence to be set in the BP inheriting this pawn class
FBlendSample IdleSample = FBlendSample(IdleSequence, FVector(.f, .f, .f), false);
FBlendSample MoveSample = FBlendSample(MoveSequence, FVector(.f, .f, .f), false);
ThisBlendSpace1D->AddSample(IdleSample);
ThisBlendSpace1D->AddSample(MoveSample); // first method
SMC_00->PlayAnimation(ThisBlendSpace1D, true); // second method
SMC_00->SetAnimation(ThisBlendSpace1D);
SMC_00->Play(true); // third method
SMC_00->OverrideAnimationData(ThisBlendSpace1D, true, true, .f, .f); // fourth method
BS_AnimInstance = Cast<UAnimSingleNodeInstance>(SMC_00->GetAnimInstance());
BS_AnimInstance->SetAnimationAsset(ThisBlendSpace1D);
BS_AnimInstance->PlayAnim(true, .f, .f);
} void AYagPawn::Tick( float DeltaSeconds)
{
Super::Tick(DeltaSeconds); [...] // update BS with Speed (a float)
BS_AnimInstance->SetBlendSpaceInput(FVector(Speed, .f, .f)); // useless in principle but i tried
SMC_00->OverrideAnimationData(ThisBlendSpace1D, true, true, .f, .f);
}
And here is the variables section in the BP:

As you can see, the BS is still empty (normal, it will be created in the begin play function at runtime) and both animations have default values.
Any idea ?
Thanks
Cedric
EDIT: i realized i wasn't setting the animation mode, so i added this in the constructor:
SMC_00->SetAnimationMode(EAnimationMode::AnimationSingleNode);
But it still doesn't work.
Answers:
Edit: I should have read your entire question. I'm interested in this so I'm going to help you get the bottom of it! You're probably missing an update call somewhere, or you need to serialize the result to an asset or something. I'll report back.
Here's a compiled simple animation blueprint. It uses a blendspace called "Strafe_IP" and has two variables: Right, Forward. Note that the Character class doesn't appear to call or update the animation - it only sets it initially.
UCLASS(config=Engine, Blueprintable, BlueprintType, meta=(ReplaceConverted="/Game/Blueprints/BPA_Test.BPA_Test_C", OverrideNativeName="BPA_Test_C"))
class UBPA_Test : public UAnimInstance
{
public:
GENERATED_BODY() UPROPERTY(meta=(OverrideNativeName="AnimGraphNode_Root_6D3BF226443B80030387A5AADD092A5D"))
FAnimNode_Root Root; UPROPERTY(meta=(OverrideNativeName="AnimGraphNode_BlendSpacePlayer_44691A814B28B34EF79F7B8F71402E07"))
FAnimNode_BlendSpacePlayer BlendSpacePlayer; UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, meta=(DisplayName="Right", Category="Default", OverrideNativeName="Right"))
float Right; UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, meta=(DisplayName="Forward", Category="Default", OverrideNativeName="Forward"))
float Forward; UBPA_Test(const FObjectInitializer& ObjectInitializer = FObjectInitializer::Get());
static void __CustomDynamicClassInitialization(UDynamicClass* InDynamicClass);
static void __StaticDependencies_CommonAssets(TArray<FBlueprintDependencyData>& AssetsToLoad);
};
UBPA_Test::UBPA_Test(const FObjectInitializer& ObjectInitializer) : Super()
{
if(HasAnyFlags(RF_ClassDefaultObject) && (UBPA_Test::StaticClass() == GetClass()))
UBPA_Test::__CustomDynamicClassInitialization(CastChecked<UDynamicClass>(GetClass())); Root.Result.LinkID = ;
BlendSpacePlayer.BlendSpace = CastChecked<UBlendSpaceBase>(CastChecked<UDynamicClass>(UBPA_Test::StaticClass())->UsedAssets[], ECastCheckedType::NullAllowed);
BlendSpacePlayer.EvaluateGraphExposedInputs.CopyRecords = TArray<FExposedValueCopyRecord> ();
BlendSpacePlayer.EvaluateGraphExposedInputs.CopyRecords.AddUninitialized();
FExposedValueCopyRecord::StaticStruct()->InitializeStruct(BlendSpacePlayer.EvaluateGraphExposedInputs.CopyRecords.GetData(), ); auto& _Right = BlendSpacePlayer.EvaluateGraphExposedInputs.CopyRecords[];
_Right.SourcePropertyName = FName(TEXT("Right"));
_Right.DestProperty = FindFieldChecked<UFloatProperty>(FAnimNode_BlendSpacePlayer::StaticStruct(), TEXT("X"));
_Right.Size = ; auto& _Forward = BlendSpacePlayer.EvaluateGraphExposedInputs.CopyRecords[];
_Forward.SourcePropertyName = FName(TEXT("Forward"));
_Forward.DestProperty = FindFieldChecked<UFloatProperty>(FAnimNode_BlendSpacePlayer::StaticStruct(), TEXT("Y"));
_Forward.Size = ; Right = 0.000000f;
Forward = 0.000000f;
} void UBPA_Test::__CustomDynamicClassInitialization(UDynamicClass* InDynamicClass)
{
ensure( == InDynamicClass->ReferencedConvertedFields.Num());
ensure( == InDynamicClass->MiscConvertedSubobjects.Num());
ensure( == InDynamicClass->DynamicBindingObjects.Num());
ensure( == InDynamicClass->ComponentTemplates.Num());
ensure( == InDynamicClass->Timelines.Num());
ensure(nullptr == InDynamicClass->AnimClassImplementation); InDynamicClass->AssembleReferenceTokenStream();
FConvertedBlueprintsDependencies::FillUsedAssetsInDynamicClass(InDynamicClass, &__StaticDependencies_DirectlyUsedAssets); auto AnimClassData = NewObject<UAnimClassData>(InDynamicClass, TEXT("AnimClassData"));
AnimClassData->TargetSkeleton = CastChecked<USkeleton>(CastChecked<UDynamicClass>(UBPA_Test::StaticClass())->UsedAssets[], ECastCheckedType::NullAllowed);
AnimClassData->RootAnimNodeIndex = ;
AnimClassData->RootAnimNodeProperty = InDynamicClass->FindStructPropertyChecked(TEXT("Root"));
AnimClassData->AnimNodeProperties = TArray<UStructProperty*> ();
AnimClassData->AnimNodeProperties.Reserve();
AnimClassData->AnimNodeProperties.Add(InDynamicClass->FindStructPropertyChecked(TEXT("Root")));
AnimClassData->AnimNodeProperties.Add(InDynamicClass->FindStructPropertyChecked(TEXT("BlendSpacePlayer")));
InDynamicClass->AnimClassImplementation = AnimClassData;
} void UBPA_Test::__StaticDependencies_CommonAssets(TArray<FBlueprintDependencyData>& AssetsToLoad)
{
const TCHAR* __Local__3 = TEXT("/Game/MovementAnimsetPro/BlendSpaces");
const TCHAR* __Local__4 = TEXT("/Game/Mannequin/Character/Mesh");
FBlueprintDependencyData LocAssets[] =
{
FBlueprintDependencyData(__Local__3, TEXT("Strafe_IP"), TEXT("Strafe_IP"), TEXT("/Script/Engine"), TEXT("BlendSpace")),
FBlueprintDependencyData(__Local__4, TEXT("UE4_Mannequin_Skeleton"), TEXT("UE4_Mannequin_Skeleton"), TEXT("/Script/Engine"), TEXT("Skeleton")),
};
for(auto& LocAsset : LocAssets) { AssetsToLoad.Add(LocAsset); }
} struct FRegisterHelper__UBPA_Test
{
FRegisterHelper__UBPA_Test()
{
FConvertedBlueprintsDependencies::Get().RegisterClass(TEXT("/Game/Blueprints/BPA_Test"), &UBPA_Test::__StaticDependenciesAssets);
}
static FRegisterHelper__UBPA_Test Instance;
}; FRegisterHelper__UBPA_Test FRegisterHelper__UBPA_Test::Instance;
Creating and using a blendspace in c++的更多相关文章
- 【解决方案】 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userHandler': Injection of resource dependencies failed;
一个错误会浪费好多青春绳命 鉴于此,为了不让大家也走弯路,分享解决方案. [错误代码提示] StandardWrapper.Throwableorg.springframework.beans.fac ...
- 如何在ASP.NET Web站点中统一页面布局[Creating a Consistent Layout in ASP.NET Web Pages(Razor) Sites]
如何在ASP.NET Web站点中统一页面布局[Creating a Consistent Layout in ASP.NET Web Pages(Razor) Sites] 一.布局页面介绍[Abo ...
- 启用SQLite的Data Provider 运行WECOMPANYSITE时遇到ERROR CREATING CONTEXT 'SPRING.ROOT': ERROR THROWN BY A DEPENDENCY OF OBJECT 'SYSTEM.DATA.SQLITE'
从网上下载的源码WeCompanySite,运行时报错 Error creating context 'spring.root': Error thrown by a dependency of ob ...
- Creating a Clean, Minimal-Footprint ASP.NET WebAPI Project with VS 2012 and ASP.NET MVC 4
Creating a Clean, Minimal-Footprint ASP.NET WebAPI Project with VS 2012 and ASP.NET MVC 4 Building O ...
- Creating a SharePoint Sequential Workflow
https://msdn.microsoft.com/en-us/library/office/hh824675(v=office.14).aspx Creating a SharePoint Seq ...
- [bigdata] 启动CM出现 “JDBC Driver class not found: com.mysql.jdbc.Driver” 以及“Error creating bean with name 'serverLogFetcherImpl'”问题的解决方法
问题:“JDBC Driver class not found: com.mysql.jdbc.Driver” 通过以下命令启动cm [root@hadoop1 ~]# /etc/init.d/cl ...
- 【安卓】aidl.exe E 10744 10584 io_delegate.cpp:102] Error while creating directories: Invalid argument
这几天在使用.aidl文件的时候eclipse的控制台总是爆出如下提示: aidl.exe E 10744 10584 io_delegate.cpp:102] Error while creatin ...
- Failed creating java D:/jre6/bin/client/jvm.dll
Failed creating java D:/jre6/bin/client/jvm.dll 标记一下 坑爹啊! 我特么装了一个64位的eclipse 结果报错 目录下确实有这个文件. 我想说 6 ...
- Spring 异常:Error creating bean with name
异常信息:org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'xxx' 我今 ...
随机推荐
- loadrunner的安装与破解
https://pan.baidu.com/s/1H4Cj0ySTwqPra5OA3nicmw 背景: 由于想做服务器的性能测试,所以最近有意研究一下loadrunner这个工具,下面仅将安装过程做个 ...
- mysql 唯一索引与null.md
mysql 的唯一索引要求所有参与的列都不能够为 null 值,如果唯一索引中的任何一个元素含有 null 值,则唯一约束将不起作用. 示例代码 create table tb ( a int, b ...
- 【论文阅读】Wing Loss for Robust Facial Landmark Localisation with Convolutional Neural Networks
Wing Loss for Robust Facial Landmark Localisation with Convolutional Neural Networks 参考 1. 人脸关键点: 2. ...
- 远程过程调用发展历程 WebAPI GRPC Hprose
作者:马秉尧链接:https://www.zhihu.com/question/23299132/answer/109978084来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...
- 关于OSI
OSI模型,即开放式通信系统互联参考模型(Open System Interconnection,OSI/RM,Open Systems Interconnection Reference Model ...
- Python全栈之路----常用模块----subprocess模块
我们经常需要通过Python去执行一条系统命令或脚本,系统的shell命令是独立于你的python进程之外的,每执行一条命令,就是发起一个新进程,通过python调用系统命令或脚本的模块在python ...
- 20155219付颖卓 Exp3 免杀原理与实践
1.基础问题回答 (1)杀软是如何检测出恶意代码的? 杀毒软件有一个病毒的特征码库,通过识别恶意代码的特征码或者特征片段检测恶意代码 杀毒软件通过动态检测对象文件的行为来识别恶意代码,如果他的行为在一 ...
- window.location各属性的值
window.location各属性的值 window.location.href "https://i.cnblogs.com/EditPosts.aspx?opt= ...
- C# 代码补全
cw + Tab + Tab 输出 Console.WriteLine(); try +Tab+Tab 输出 try catch代码块 foreach + Ta ...
- win10 安装 face_recognition
环境:Python 3.6.4 |Anaconda, Inc.| (default, Jan 16 2018, 10:22:32) [MSC v.1900 64 bit (AMD64)] on win ...