[UE4]状态机,实现动画播放
2018-02-24 17:58
656 查看
不好意思,我稍稍标题党了,目前还不清楚如何用C++代码来实现BlendSpace和Montage的逻辑,如果这两个文件也不我们创建了,那么以下内容就是真正意义上的纯C++实现角色蓝图和动画蓝图。 逻辑用C++,动画处理用蓝图,对于有一定复杂度的项目来说这种做法很不方便,最方便的方式就是所有跟蓝图相关的操作能够让C++编码实现。即使是简单项目,但是如果模型数量有几十个,每个模型的动画切换逻辑是一样的,让你给每一个模型编辑动画状态机也是个体力活,所以如果这些可以用C++代码实现的话,只写一遍动画操作的逻辑,就可以一劳永逸。 用C++代码指定Actor的SkeletalMesh用过蓝图的都知道,一般指定SkeletalMesh是在角色蓝图中指定的:
现在没有角色蓝图了,设置SkeletalMesh的C++代码如下:Cpp代码
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变量,并在编辑器中设置该BlendSpaceCpp代码
UPROPERTY(BlueprintReadOnly, EditAnywhere, Category = "Anims")
UBlendSpace1D *BlendSpace;
2,设置BlendSpace参数并播放动画,这里BlendSpace假设以X轴为方向 需要包含头文件:#include "Runtime/Engine/Classes/Animation/SkeletalMeshActor.h"Cpp代码
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位置播放AnimationSequence1,先定义一个UPROPERTY变量,并在编辑器中设置该UAnimSequence Cpp代码
UPROPERTY(BlueprintReadOnly, EditAnywhere, Category = "Anims");
UAnimSequence *MyAnimSequence;
2,在指定插槽Slot上播放:
Cpp代码
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:
Cpp代码
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 Updateshttps://wiki.unrealengine.com/Animation_Blueprint,_Implement_Custom_C%2B%2B_Logic_Via_Tick_Updates
Using Additive Animationshttps://docs.unrealengine.com/latest/INT/Engine/Animation/AnimHowTo/AdditiveAnimations/index.html
相关文章推荐
- UE4]不使用角色蓝图、动画蓝图、状态机,用“24K纯C++”实现动画播放
- 3.Tom猫的实现(帧动画播放)
- Android高级控件(二)——SurfaceView实现GIF动画架包,播放GIF动画,自己实现功能的初体现
- 22—(图文详解)游戏中灵活实现动画播放!简述J2me的游戏类库与Android游戏开发
- cocos 3.X 关于代码实现一段动画的播放 20180312 day4
- 【Android游戏开发二十二】(图文详解)游戏中灵活实现动画播放!简述J2me的游戏类库与Android游戏开发!
- Android动画背景图自动播放的实现程序
- Qt 中 实现gif动画的播放
- iOS 简单实现gif动画播放
- Android高级控件(二)——SurfaceView实现GIF动画架包,播放GIF动画,自己实现功能的初体现
- (图文详解)游戏中灵活实现动画播放!简述J2me的游戏类库与Android游戏开发!
- Android动画背景图自动播放的实现
- 【Android游戏开发二十二】(图文详解)游戏中灵活实现动画播放!简述J2me的游戏类库与Android游戏开发!
- Android PowerImageView实现,可以播放动画的强大ImageView
- Android PowerImageView实现,可以播放动画的强大ImageView (转)
- 【Android游戏开发二十二】(图文详解)游戏中灵活实现动画播放!简述J2me的游戏类库与Android游戏开发!
- iOS下UIButton压下后播放动画,松开后动画消失的实现
- cocos2d+lua实现帧动画播放
- 【Android游戏开发二十二】(图文详解)游戏中灵活实现动画播放!简述J2me的游戏类库与Android游戏开发!
- Android实现播放GIF动画的强大ImageView