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

这里写图片描述
1、先写个继承自 UAnimInstance 的基类 UMyAnimInstance
UMyAnimInstance.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| #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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| 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) { 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、然后就可以通过这两个变量来控制动画
1 2
| CharState mCharState; EAnimType mAnimType;
|
具体看上面的代码,在这个函数里
1
| void UMyAnimInstance::NativeUpdateAnimation(float DeltaSeconds)
|