1.创建一个动画实例
2.创建该实例的c++子类
3.继续创建该类的子类,但是作用是用来链接(以后会详细解释)
4.基于PlayerAnimInstance类创建一个子类
5.目前一共创建了四个c++类,
最基的类
角色的类
玩家控制的角色的类
玩家控制的角色的武器的类
6.进入XMBCharcterAnimInstance,覆写
public:// 自定义初始化逻辑(例如设置骨骼引用、动画曲线等)virtual void NativeInitializeAnimation() override;//这个函数在一个工作线程上运行而不是在游戏线程上运行,意味着使用此函数计算需要的所有变量可以相当优化virtual void NativeThreadSafeUpdateAnimation(float DeltaSeconds) override;
创建变量
protected://设置基于角色来获取类型UPROPERTY()ACharacterBase* OwningCharacter;//移动组件UPROPERTY()UCharacterMovementComponent* OwningMovementComponent;//行走速度UPROPERTY(VisibleDefaultsOnly, BlueprintReadOnly, Category = "AnimData")float GroundSpeed;//是否有加速度UPROPERTY(VisibleDefaultsOnly, BlueprintReadOnly, Category = "AnimData")bool bHasAcceleration;
7.实现函数
//目的:在初始化动画中获取我们需要的关键变量
void UXMBCharacterAnimInstance::NativeInitializeAnimation()
{//获取当前所有者OwningCharacter = Cast<ACharacterBase>(TryGetPawnOwner());if (OwningCharacter){OwningMovementComponent = OwningCharacter->GetCharacterMovement();}
}//在更新动画中获取我们的蓝图动画需要的变量
void UXMBCharacterAnimInstance::NativeThreadSafeUpdateAnimation(float DeltaSeconds)
{if (!OwningCharacter || !OwningMovementComponent){return;}//获取当前Owner的移动速度和加速度GroundSpeed = OwningCharacter->GetVelocity().Size2D();//判断Owner是否具有加速度bHasAcceleration = OwningMovementComponent->GetCurrentAcceleration().SizeSquared2D() > 0.f;
}
8.启动引擎,创建一个属于PlayerAnimInstance的动画蓝图
创建好后选择这个,并且能看到变量内有自己创建的变量,则成功
9.创建一个混合空间,选择
创建好后打开,在左侧栏填入变量名称,并且把x值最大改为400,
10.进入动画蓝图,创建一个状态机
11.设置状态机
12.设置完后进入角色蓝图,然后设置对应的蓝图动画即可