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

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)
{ //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、然后就可以通过这两个变量来控制动画

1
2
CharState	mCharState;
EAnimType mAnimType;

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

1
void UMyAnimInstance::NativeUpdateAnimation(float DeltaSeconds)