ue4 中动画控制,利用conduit节点

来源:互联网 发布:矩阵和伴随矩阵的秩 编辑:程序博客网 时间:2024/05/20 19:47

Actor的动画状态可能有几种idle,run,walk,skill,而skill中由又有几种不同的技能动作,要做进步一控制,这里只是提供一种思路,利用动画蓝图里的 conduit 节点,减少大量重复性的 state(比如某一状态到n种技能状态的切换)。


先来看看总体的动画蓝图(Animation Blueprint)
这里写图片描述



1、先写个继承自 UAnimInstance 的基类 UMyAnimInstance

UMyAnimInstance.h

#include "../CharTypes.h"#include "../Skill/SkillTypes.h"#include "MyAnimInstance.generated.h"class AMyChar;class USkillTemplate;class UMyAnimInstance;DECLARE_DELEGATE_OneParam(FStateNotify, CharState); UCLASS()class UMyAnimInstance : public UAnimInstance{    GENERATED_BODY()public:    UMyAnimInstance();    virtual ~UMyAnimInstance();    UFUNCTION(BlueprintCallable, Category = "UMyAnimInstance")        AMyChar* GetOwnerChar();    virtual void NativeUpdateAnimation(float DeltaSeconds) override;public:    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "UMyAnimInstance")        AMyChar*    mOwnerChar;    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "UMyAnimInstance")        float       mSpeed;    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "UMyAnimInstance")        CharState   mCharState; //控制角色动画的枚举    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "UMyAnimInstance")        EAnimType   mAnimType; //各种技能动画的枚举,在技能状态下细分各种技能    FStateNotify    mStateDlg;};

UMyAnimInstance.cpp

UMyAnimInstance::UMyAnimInstance(){    mOwnerChar = nullptr;    mSpeed = 0.f;    mCharState = CharState::IdleRun;    mAnimType = EAnimType::None;    mStateDlg.BindLambda([&](CharState _state)->void {        mCharState = _state;    });}UMyAnimInstance::~UMyAnimInstance(){}AMyChar* UMyAnimInstance::GetOwnerChar(){    if (!mOwnerChar)    {        APawn* owner = TryGetPawnOwner();        mOwnerChar = owner ? Cast<AMyChar>(owner) : nullptr;    }    return mOwnerChar;}void UMyAnimInstance::NativeUpdateAnimation(float DeltaSeconds){    Super::NativeUpdateAnimation(DeltaSeconds);    if (mOwnerChar == nullptr)    {        mOwnerChar = GetOwnerChar();    }    if (mOwnerChar != nullptr)    {   //TODO: 待优化,不变时不需要去get        mSpeed = mOwnerChar->GetVelocity().Size(); //设置速度        USkillFunction* skillFunc = mOwnerChar->GetUsingSkill(); //正在使用的技能        USkillTemplate* skillTemp = skillFunc != nullptr ? skillFunc->GetSkillTemplate() : nullptr;        mAnimType = skillTemp != nullptr ? skillTemp->mAnimType : EAnimType::None; //设置动画类型    }}

2、创建个 蓝图对象 继承自 UMyAnimInstance

这里写图片描述

选择父类 MyAnimInstance,(u是命名规则被省去了),选择 fbx 动画
这里写图片描述


3、动画蓝图的各种状态描述,只要是使用conduit这个节点

这里写图片描述

这里写图片描述


4、然后就可以通过这两个变量来控制动画

        CharState   mCharState;        EAnimType   mAnimType;

具体看上面的代码,在这个函数里

void UMyAnimInstance::NativeUpdateAnimation(float DeltaSeconds)
0 0
原创粉丝点击