UE4]不使用角色蓝图、动画蓝图、状态机,用“24K纯C++”实现动画播放
http://aigo.iteye.com/blog/2283454
原文作者:@玄冬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++中分别对应UBlendSpace和UAnimSequence。
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);
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++”实现动画播放的更多相关文章
- [UE4]角色、动画蓝图、动画蒙太奇、动画之间的调用关系
一.在“角色”中设置要使用的“动画蓝图” 二.在“动画蓝图”中使用“动画”和“混合动画” 三.在“混合动画”中,也可以使用“动画” 四.在角色中使用“动画蒙太奇”
- Unreal Engine4 学习笔记1 状态机 动画蓝图
1.动画蓝图 包含 状态机 包含 混合空间BlendSpace,即状态机包含在动画蓝图的"动画图表中",而混合空间可用于在状态机中向某(没)一个状态输出最终POSE: 动画蓝 ...
- ue4动画蓝图
动画资源 animation sequence 序列动画 :一帧一骨骼 montage 片断动画 : 动画蒙太奇 将不同的片断组成一个动画 blend space 混合动画 : 将2 ...
- Unity3D中通过Animator动画状态机获取任意animation clip的准确播放持续时长
Unity3d 4及之前的版本中动画的播放用的animation,可直接获取其播放持续长度.但5.x及以后的版本中都是用animator来播放动画了. https://docs.unity3d.com ...
- Unity中的动画系统和Timeline(3) 混合树和动画匹配
混合树 前面我们通过在Animation界面添加单独的动作来控制动画,这样做比较麻烦,每个单独的属性,比如站立,奔跑等,都需要单独的代码来控制.现在我们可以通过使用混合树,其基本思想是将相近的动画混合 ...
- Android动画效果之Property Animation进阶(属性动画)
前言: 前面初步认识了Android的Property Animation(属性动画)Android动画效果之初识Property Animation(属性动画)(三),并且利用属性动画简单了补间动画 ...
- Android动画效果之初识Property Animation(属性动画)
前言: 前面两篇介绍了Android的Tween Animation(补间动画) Android动画效果之Tween Animation(补间动画).Frame Animation(逐帧动画)Andr ...
- Android动画效果之Frame Animation(逐帧动画)
前言: 上一篇介绍了Android的Tween Animation(补间动画) Android动画效果之Tween Animation(补间动画),今天来总结下Android的另外一种动画Frame ...
- Android动画效果之Tween Animation(补间动画)
前言: 最近公司项目下个版本迭代里面设计了很多动画效果,在以往的项目中开发中也会经常用到动画,所以在公司下个版本迭代开始之前,抽空总结一下Android动画.今天主要总结Tween Animation ...
随机推荐
- 在JDK 6和JDK 7的substring()方法的区别?
原文链接:https://www.programcreek.com/2013/09/the-substring-method-in-jdk-6-and-jdk-7/ 在JDK 6和JDK 7中subs ...
- Kaggle系列1:手把手教你用tensorflow建立卷积神经网络实现猫狗图像分类
去年研一的时候想做kaggle上的一道题目:猫狗分类,但是苦于对卷积神经网络一直没有很好的认识,现在把这篇文章的内容补上去.(部分代码参考网上的,我改变了卷积神经网络的网络结构,其实主要部分我加了一层 ...
- hashMap的线程不安全
hashMap是非线程安全的,表现在两种情况下: 1 扩容: t1线程对map进行扩容,此时t2线程来读取数据,原本要读取位置为2的元素,扩容后此元素位置未必是2,则出现读取错误数据. 2 hash碰 ...
- python读取文件的几种方式
http://www.cnblogs.com/nkwy2012/p/6023710.html
- 轻量级RPC框架开发
nio和传统io之间工作机制的差别 自定义rpc框架的设计思路 rpc框架的代码运行流程 第2天 轻量级RPC框架开发 今天内容安排: 1.掌握RPC原理 2.掌握nio操作 3.掌握netty简单的 ...
- BZOJ 1231 [Usaco2008 Nov]mixup2 混乱的奶牛:状压dp + 滚动数组
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1231 题意: 给你n个数字s[i],问你有多少个排列,使得任意相邻两数字之差的绝对值大于m ...
- RQNOJ 95 多多看DVD(加强版):01背包
题目链接:https://www.rqnoj.cn/problem/95 题意: 叔叔要陪多多看动画片. 有n张DVD可以买,第i张碟的打分为w[i],播放时间为t[i]. 爷爷规定他们只能在一定的时 ...
- idea创建maven-archetype-webapp项目无java目录
使用idea创建一个maven-archetype-webapp项目 查看项目的目录结构,在main的目录下没有java目录 在main目录下创建java目录 使用快捷键 ctrl+alt+shift ...
- ES索引瘦身 禁用_source后需要设置field store才能获取数据 否则无法显示搜索结果
在默认情况下,开启_all和_source 这样索引下来,占用空间很大. 根据我们单位的情况,我觉得可以将需要的字段保存在_all中,然后使用IK分词以备查询,其余的字段,则不存储. 并且禁用_sou ...
- 初识Spacy
之所以想接触Spacy,是看到其自称为工业级的应用,所以想尝试下 windows下安装Spacy: 直接安装pip install spacy是会报错的 解决方法: 到 htt ...