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: 待优化,不变时不需要去getmSpeed = 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)