[UE4]C++实现角色蓝图和动画蓝图

发表于2018-02-26
评论0 9.5k浏览

下面给大家介绍下在C++中实现角色蓝图和动画蓝图。

 

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


用过蓝图的都知道,一般指定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:

上面例子中UBlendSpace1D和UAnimSequence变量可以在编辑器中设置以外,也可以通过C++代码加载设置,具体方法:C++实现动态加载的问题:LoadClass<T>()和LoadObject<T>()
来自:http://aigo.iteye.com/blog/2283454

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

0个评论