[UE4]状态机,实现动画播放


博客分类:  UnrealEngine
UE4


 

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

 

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

 

用C++代码指定Actor的SkeletalMesh

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

 

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

Cpp代码   收藏代码
  1. USkeletalMesh* MyMesh = LoadObject<USkeletalMesh>(NULL, TEXT("SkeletalMesh'/Game/MyMesh.MyMesh'"));  
  2. MyActor* Actor = World->SpawnActor<MyActor>(FVector(1000, 1000, 0), FRotator(0, 0, 0));  
  3. Actor->GetMesh()->SetSkeletalMesh(MyMesh);  

 
  

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

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

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

Cpp代码   收藏代码
  1. UPROPERTY(BlueprintReadOnly, EditAnywhere, Category = "Anims")  
  2. UBlendSpace1D *BlendSpace;  
 

 

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

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

Cpp代码   收藏代码
  1. ASkeletalMeshActor *Skel = Cast<ASkeletalMeshActor>(MyActor);  
  2. if (Skel)  
  3. {  
  4.     USkeletalMeshComponent *Mesh = Skel->GetSkeletalMeshComponent();  
  5.     if (Mesh)  
  6.     {  
  7.         Mesh->PlayAnimation(BlendSpace, true);  
  8.         FVector BlendParams(50.0f, 0.0f, 0.0f);  
  9.         Mesh->GetSingleNodeInstance()->SetBlendSpaceInput(BlendParams);  
  10.     }  
  11. }  
 

  

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

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

 

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

3,播放AnimMontage:
Cpp代码   收藏代码
  1. MyAnimTimer = AnimInstance->Montage_Play(MyMontage);  
  2. 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

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在UE4中播放关卡序列动画,有两种方法。第一种是在关卡蓝图中添加引用,并使用play节点来播放关卡序列。具体步骤如下:将创建好的关卡序列拖入场景中,选中需要播放的关卡序列,在关卡蓝图中添加引用,然后添加play节点。这样就可以轻松播放关卡序列了。然而,这种方法可能会出现一个bug,当想要在动画末尾暂停时会出现问题。这是因为创建关卡序列播放器节点相当于在运行时在场景中新建了一个新的关卡序列,与我们之前设置的关卡序列不一致。为了解决这个问题,可以使用第二种方法。在UMG中创建一个可编辑实例的关卡序列actor变量,然后在关卡蓝图中创建对这个关卡序列的引用,并添加play节点。这样就可以播放关卡序列了。如果想再次点击按钮恢复到原来的状态,可以使用flip flop节点和翻转播放节点。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [UE4-UMG点击播放关卡序列(Level Sequence)](https://blog.csdn.net/qq_39590773/article/details/126506405)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [带序列发生器的过场动画.rar](https://download.csdn.net/download/hraay_lk/11938327)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [UE4-(蓝图)第四十四课过场动画之创建及动画添加](https://blog.csdn.net/lei_7103/article/details/103178851)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值