一、一点说明
动画实例通过扩展为所有机器上的每个字符都存在动画蓝图,动画实例只能访问该计算机上的变量。
二、思路
我在武器组件中有一个武器类的指针,判断当前指针是否为空去判断当前角色是否装备武器
三、实现
1.在角色C++类中添加是否装备武器的函数,功能是判断角色是否装备武器,在角色类中添加这个函数是因为我将武器组件的类指针定义在了角色的头文件中
//H
bool IsWeaonEquipped();
//CPP
bool ABlasterCharacter::IsWeaonEquipped()
{
/** 判断是否有武器组件部分Combat 判断Combat->EquippedWeapon指针是否存在 */
return (Combat && Combat->EquippedWeapon);
}
2.在角色动画的C++类中添加一个变量,属性是 蓝图只读 类型是Character 允许私有访问,在更新动画的重写的虚函数中将变量赋值
//H
UPROPERTY(BlueprintReadOnly, Category = Character, meta = (AllowPrivateAccess = "true"))/** 蓝图只读 类型是Character 允许私有访问 */
bool bWeaponEquipped;
//CPP
void UBlasterAnimInstance::NativeUpdateAnimation(float DeltaTime)
{
Super::NativeUpdateAnimation(DeltaTime);
/** add by begin 之前的代码可以不用参考 */
/* 判断当前角色是否为空 为空获得当前角色当作第一帧 */
if (BlasterCharacter == nullptr)
{
BlasterCharacter = Cast<ABlasterCharacter>(TryGetPawnOwner());
}
if (BlasterCharacter == nullptr)return;
/* 只想获得平面上xy的速度的向量,将z方向的速度置为0 */
FVector Velocity = BlasterCharacter->GetVelocity();
Velocity.Z = 0.f;
/* 获得速度的向量 */
Speed = Velocity.Size();
bIsInAir = BlasterCharacter->GetCharacterMovement()->IsFalling(); /** IsFalling()判断是否在空中 GetCharacterMovement()获得人物移动 */
bIsAccelerating = BlasterCharacter->GetCharacterMovement()->GetCurrentAcceleration().Size() > 0.f ? true : false;
/** add by end 之前的代码可以不用参考 */
/* 获得是否装备武器 */
bWeaponEquipped = BlasterCharacter->IsWeaonEquipped();
}
3.在武器组件的类中将武器类指针属性设置为可复制,重写virtual void GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const override;函数注册REP变量
// H
UPROPERTY(Replicated)
AWeapon* EquippedWeapon;
/** 要标记要复制的内容,我们使用 UPROPERTY 中的 Replicated 说明符。
在将某个内容标记为 Replicated 之后,我们必须定义一个名为 GetLifetimeReplicatedProps 的新函数 */
/** 返回用于网络复制的属性,这需要被所有具有本机复制属性的 actor 类覆盖 */
virtual void GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const override;
// CPP
#include "Net/UnrealNetwork.h"
void UCombatComponent::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
{
Super::GetLifetimeReplicatedProps(OutLifetimeProps);
/** 指定了具有复制变量的类 和 复制的变量是哪个 */
DOREPLIFETIME(UCombatComponent, EquippedWeapon);
}
四、蓝图实现
1.打开角色动画蓝图
2.在空白处右键选择如图
3. 如图
4.如图
5.如图,创建新的状态机,这个状态机是装备武器后的状态的状态机
6.如图双击状态机,如图拖拽一个动画如图
7.编译保存,可以尝试运行
8.当前只加入了一个动画,剩下的还没学到