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

原文作者:@玄冬Wong

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

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

用C++代码指定Actor的SkeletalMesh

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

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

  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++中分别对应UBlendSpace和UAnimSequence。

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

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

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

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

  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

  1. UPROPERTY(BlueprintReadOnly, EditAnywhere, Category = "Anims");
  2. UAnimSequence *MyAnimSequence;

2,在指定插槽Slot上播放:

  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. }

注:GetAnimInstance之前需要SetAnimInstanceClass,如何设置,参见:
http://aigo.iteye.com/blog/2285001



3,播放AnimMontage:
  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

UE4]不使用角色蓝图、动画蓝图、状态机,用“24K纯C++”实现动画播放的更多相关文章

  1. [UE4]角色、动画蓝图、动画蒙太奇、动画之间的调用关系

    一.在“角色”中设置要使用的“动画蓝图” 二.在“动画蓝图”中使用“动画”和“混合动画” 三.在“混合动画”中,也可以使用“动画” 四.在角色中使用“动画蒙太奇”

  2. Unreal Engine4 学习笔记1 状态机 动画蓝图

    1.动画蓝图 包含 状态机 包含 混合空间BlendSpace,即状态机包含在动画蓝图的"动画图表中",而混合空间可用于在状态机中向某(没)一个状态输出最终POSE:    动画蓝 ...

  3. ue4动画蓝图

    动画资源 animation sequence  序列动画 :一帧一骨骼 montage   片断动画 : 动画蒙太奇   将不同的片断组成一个动画 blend space    混合动画  : 将2 ...

  4. Unity3D中通过Animator动画状态机获取任意animation clip的准确播放持续时长

    Unity3d 4及之前的版本中动画的播放用的animation,可直接获取其播放持续长度.但5.x及以后的版本中都是用animator来播放动画了. https://docs.unity3d.com ...

  5. Unity中的动画系统和Timeline(3) 混合树和动画匹配

    混合树 前面我们通过在Animation界面添加单独的动作来控制动画,这样做比较麻烦,每个单独的属性,比如站立,奔跑等,都需要单独的代码来控制.现在我们可以通过使用混合树,其基本思想是将相近的动画混合 ...

  6. Android动画效果之Property Animation进阶(属性动画)

    前言: 前面初步认识了Android的Property Animation(属性动画)Android动画效果之初识Property Animation(属性动画)(三),并且利用属性动画简单了补间动画 ...

  7. Android动画效果之初识Property Animation(属性动画)

    前言: 前面两篇介绍了Android的Tween Animation(补间动画) Android动画效果之Tween Animation(补间动画).Frame Animation(逐帧动画)Andr ...

  8. Android动画效果之Frame Animation(逐帧动画)

    前言: 上一篇介绍了Android的Tween Animation(补间动画) Android动画效果之Tween Animation(补间动画),今天来总结下Android的另外一种动画Frame ...

  9. Android动画效果之Tween Animation(补间动画)

    前言: 最近公司项目下个版本迭代里面设计了很多动画效果,在以往的项目中开发中也会经常用到动画,所以在公司下个版本迭代开始之前,抽空总结一下Android动画.今天主要总结Tween Animation ...

随机推荐

  1. 使用 Spring 容器管理 Filter

    当我们用Filter时,往往需要使用一些辅助的service,在普通的java中,只要声明(set,get方法)后在spring-application配置文件中配置就可以了,但是由于Filter与L ...

  2. c#应用程序带参数运行

    有时候我们需要让软件带参数运行,使用参数控制软件的部分行为, C#默认窗口应用是不带参数的,不过在Main函数的参数手动加上就可以得到参数了. 举例如下: /// <summary> // ...

  3. quick check

  4. 游戏引擎基于Handle的资源管理

    基于Handle的资源管理方案,第一时间想到的应该是Windows了,但是真正想让我实施这个方案的,是<游戏编程精粹1>里面的游戏资源管理篇章的给出的方案.在<游戏编程精粹1> ...

  5. javascript(9)

    js中访问函数 p1.abc() p1["abc"]; js中基于对象 == js面向对象

  6. IDEAL葵花宝典:java代码开发规范插件 lombok 插件

    前言: lombok简介: lombok是暑假来到公司实习的时候发现的一个非常好用的小工具,刚见到的时候就感觉非常惊艳,有一种相见恨晚的感觉,用了一段时间之后感觉的确挺不错,所以特此来推荐一下. 那么 ...

  7. Dual Path Networks(DPN)——一种结合了ResNet和DenseNet优势的新型卷积网络结构。深度残差网络通过残差旁支通路再利用特征,但残差通道不善于探索新特征。密集连接网络通过密集连接通路探索新特征,但有高冗余度。

    如何评价Dual Path Networks(DPN)? 论文链接:https://arxiv.org/pdf/1707.01629v1.pdf在ImagNet-1k数据集上,浅DPN超过了最好的Re ...

  8. 语义化npm版本号

    参考资料: 语义化版本2.0.0 the semantic versioner for npm 在package的devDependencies和dependencies2个字段中有指定依赖包版本,这 ...

  9. logistic function 和 sigmoid function

     简单说, 只要曲线是 “S”形的函数都是sigmoid function: 满足公式<1>的形式的函数都是logistic function. 两者的相同点是: 函数曲线都是“S”形. ...

  10. android自定义控件(六) 刷新

    三种得到LinearInflater的方法 a. LayoutInflater inflater = getLayoutInflater(); b. LayoutInflater localinfla ...