C++实现动画播放

来源:互联网 发布:樱井知香步兵番号 编辑:程序博客网 时间:2024/05/24 06:49
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、3D均可)
因为动画蓝图也没有了,所以播放BlendSpace和AnimationSequence也通过C++代码实现

 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);


AnimInstance是Animation Blueprint的C++版本。

角色蓝图中,设置动画蓝图是设置的Anim Class属性:


 

这个设置的步骤如果用C++操作,如下设置:

Cpp代码  收藏代码
  1. USkeletalMeshComponent::SetAnimInstanceClass(UClass* NewClass);  

 具体实例:

Cpp代码  收藏代码
  1. UAnimBlueprintGeneratedClass* MeshAnim = LoadObject<UAnimBlueprintGeneratedClass>(NULL, TEXT("/Game/Character/HeroTPP_AnimBlueprint.HeroTPP_AnimBlueprint"));  
  2. Mesh->SetAnimInstanceClass(MeshAnim);  

 

如果想用C++ UAnimInstance代替蓝图动画,那么需要创建一个自己的UAnimInstance,并在其中实现自己的动画逻辑,UAnimInstance里面的具体函数还不熟悉,先标记下,等项目后期再将动画蓝图改为C++。



上面例子中UBlendSpace1D和UAnimSequence变量可以在编辑器中设置以外,也可以通过C++代码加载设置,具体方法:

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

http://aigo.iteye.com/blog/2281558
0 0
原创粉丝点击