[UE4]不使用角色蓝图、动画蓝图、状态机,用“24K纯C++”实现动画播放

news/2024/7/16 8:00:33

原文作者:@玄冬Wong 

 

不好意思,我稍稍标题党了,目前还不清楚如何用C++代码来实现BlendSpace和Montage的逻辑,如果这两个文件也不我们创建了,那么以下内容就是真正意义上的纯C++实现角色蓝图和动画蓝图。

 

逻辑用C++,动画处理用蓝图,对于有一定复杂度的项目来说这种做法很不方便,最方便的方式就是所有跟蓝图相关的操作能够让C++编码实现。即使是简单项目,但是如果模型数量有几十个,每个模型的动画切换逻辑是一样的,让你给每一个模型编辑动画状态机也是个体力活,所以如果这些可以用C++代码实现的话,只写一遍动画操作的逻辑,就可以一劳永逸。

 

用C++代码指定Actor的SkeletalMesh

用过蓝图的都知道,一般指定SkeletalMesh是在角色蓝图中指定的:

 

现在没有角色蓝图了,设置SkeletalMesh的C++代码如下:

USkeletalMesh* MyMesh = LoadObject<USkeletalMesh>(NULL, TEXT("SkeletalMesh'/Game/MyMesh.MyMesh'"));
MyActor* Actor = World->SpawnActor<MyActor>(FVector(1000, 1000, 0), FRotator(0, 0, 0));
Actor->GetMesh()->SetSkeletalMesh(MyMesh);

 
  

用C++代码播放BlendSpace (1D、2D均可)

因为动画蓝图也没有了,所以播放BlendSpace和AnimationSequence也通过C++代码实现:
两种材质的类型在C++中分别对应UBlendSpaceUAnimSequence

 1,先定义一个UPROPERTY变量,并在编辑器中设置该BlendSpace

UPROPERTY(BlueprintReadOnly, EditAnywhere, Category = "Anims")
UBlendSpace1D *BlendSpace;
 

 

2,设置BlendSpace参数并播放动画,这里BlendSpace假设以X轴为方向

 需要包含头文件:#include "Runtime/Engine/Classes/Animation/SkeletalMeshActor.h"

ASkeletalMeshActor *Skel = Cast<ASkeletalMeshActor>(MyActor);
if (Skel)
{
	USkeletalMeshComponent *Mesh = Skel->GetSkeletalMeshComponent();
	if (Mesh)
	{
		Mesh->PlayAnimation(BlendSpace, true);
		FVector BlendParams(50.0f, 0.0f, 0.0f);
		Mesh->GetSingleNodeInstance()->SetBlendSpaceInput(BlendParams);
	}
}
 

  

用C++代码在指定Slot位置播放AnimationSequence

1,先定义一个UPROPERTY变量,并在编辑器中设置该UAnimSequence

 

UPROPERTY(BlueprintReadOnly, EditAnywhere, Category = "Anims");
UAnimSequence *MyAnimSequence;
 
2,在指定插槽Slot上播放:
USkeletalMeshComponent *Mesh = MyActor->FindComponentByClass<USkeletalMeshComponent>();
if (Mesh)
{
	UAnimInstance *AnimInst = Mesh->GetAnimInstance();
	if (AnimInst)
	{
		AnimInst->PlaySlotAnimationAsDynamicMontage(MyAnimSequence, TEXT("UpperBody"), 0.1f, 0.1f, 1.0f, 30.0f);
	}
}
 
注:GetAnimInstance之前需要SetAnimInstanceClass,如何设置,参见:
http://aigo.iteye.com/blog/2285001

3,播放AnimMontage:
MyAnimTimer = AnimInstance->Montage_Play(MyMontage);
GetWorldTimerManager().SetTimer(PauseMontageTimerHandle, this, &MyActor::PauseMontageFunc, MyAnimTimer, false);
上面例子中UBlendSpace1D和UAnimSequence变量可以在编辑器中设置以外,也可以通过C++代码加载设置,具体方法:

C++实现动态加载的问题:LoadClass<T>()和LoadObject<T>()

http://aigo.iteye.com/blog/2281558

 

文章参考自:

How can I play animations strictly from C++? 这个帖子讲了如何不使用动画蓝图,不使用动画状态机,纯C++编码方式实现动画播放。

https://answers.unrealengine.com/questions/292345/how-can-i-play-animations-strictly-from-c.html


Animation Blueprint, Implement Custom C++ Logic Via Tick Updates

https://wiki.unrealengine.com/Animation_Blueprint,_Implement_Custom_C%2B%2B_Logic_Via_Tick_Updates

Using Additive Animations

https://docs.unrealengine.com/latest/INT/Engine/Animation/AnimHowTo/AdditiveAnimations/index.html

 

 


http://www.niftyadmin.cn/n/3921975.html

相关文章

KBEngine奇技淫巧<四>

KBEngine定时器定时器介绍EventDispatcherTimer 时间 定时器container_timeQueue_TimerTTimeprocessadd总结一下定时器介绍 是时候放出灵魂框架图了&#xff0c;KBEngine最重要的几个类 是的&#xff0c;这个图就说明了KBEngine引擎最重要的几个类。从程序来看&#xff0c;最…

[C++]为什么模板函数的声明与实现都放在.h头文件中

原文&#xff1a;http://www.360doc.com/content/13/0722/14/10072361_301717293.shtml 当你不使用这个模版函数或模版类,编译器并不实例化它 ,当你使用时&#xff0c;编译器需要实例化它&#xff0c; 因为编译器是一次只能处理一个编译单元, 也就是一次处理一个cpp文件,所以…

KBEngine奇技淫巧<五>

KBEngine网络网络模块的组织EventPoller结构图对象组织InputNotificationHandler如何创建各种HandlerLIstener初始化Receiver创建Channel各种协议Handler的调用NetworkInterfaceChannel 就是socket连接NetworkInerface的结构总结一下网络模块的组织 KBEngine最核心的三个模块我…

[UE4]APlayerController::PlayerTick()注意事项

官方文档&#xff1a; APlayerController::PlayerTick() https://docs.unrealengine.com/latest/INT/API/Runtime/Engine/GameFramework/APlayerController/PlayerTick/index.html PlayerController用PlayerTick&#xff0c;Character中有Tick函数&#xff0c;什么时候用Player…

RTS游戏的寻路算法:群体移动时如何绕开友军阻挡

参考&#xff1a; https://www.zhihu.com/question/29885931 wq yang 这个函数&#xff1a; https://github.com/spring/spring/blob/a2a84b654354e5da1f828b5fd7db280d90d0596d/rts/Sim/MoveTypes/ClassicGroundMoveType.cpp#L754 主要算法从这一行开始&#xff1a;https://gi…

C++中std::max、std::min需要的头文件

编译错误&#xff1a; error C2039: max: is not a member of std 解决办法&#xff1a; 添加头文件 #include <algorithm>

[UE4]贴图一面正常另一面透明的问题

问题现象&#xff1a; 解决办法&#xff1a; 打开材质Material&#xff0c;勾选属性&#xff1a;Two Sided

[UE4]用SetActorLocation()移动物体的同时实现碰撞检测

要移动物体&#xff0c;一般是调用UE4内建的寻路API&#xff1a;UNavigationSystem::SimpleMoveToLocation()。 但是如果项目的逻辑比较特殊&#xff0c;想绕开UE4自带的寻路系统的话&#xff0c;一般可以调用&#xff1a;YourActor->GetOwner()->SetActorLocation()。 但…