同步系列9-下蹲的动画和同步


老样子先看输入

1
2
3
4
5
6
7
8
9
10
11
12
13
	//按下Ctrl下蹲
EnhancedInputComponent->BindAction(IA_CrouchPressed, ETriggerEvent::Triggered, this, &ABlasterCharacter::CrouchButtonPressed);
void ABlasterCharacter::CrouchButtonPressed(const FInputActionValue& InputValue)
{
if(bIsCrouched)
{
UnCrouch();
}
else
{
Crouch();
}
}

UnCrouch和Crouch都是虚幻已经写好的函数,角色类直接用就行,具体实现可以点进去看。bIsCrouched变量是Character.h基类里的,其值会在UnCrouch和Crouch中修改,声明如下。

1
2
3
/** Set by character movement to specify that this Character is currently crouched. */
UPROPERTY(BlueprintReadOnly, replicatedUsing=OnRep_IsCrouched, Category=Character)
uint32 bIsCrouched:1;

可以看出这个变量是属性复制的,其对应的回调OnRep_IsCrouched实现如下,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void ACharacter::OnRep_IsCrouched()
{
if (CharacterMovement)
{
if (bIsCrouched)
{
CharacterMovement->bWantsToCrouch = true;
CharacterMovement->Crouch(true);
}
else
{
CharacterMovement->bWantsToCrouch = false;
CharacterMovement->UnCrouch(true);
}
CharacterMovement->bNetworkUpdateReceived = true;
}
}

可以看出,角色蹲起与否的网络同步已经被实现了。

最后在动画蓝图中添加是否蹲伏的变量。

1
2
3
4
5
6
7
8
9
10
UPROPERTY(BlueprintReadOnly, Category = Anim, meta = (AllowPrivateAccess = "true"))
bool bIsCrouched;
void UBlasterAnimInstance::NativeUpdateAnimation(float DeltaTime)
{
Super::NativeUpdateAnimation(DeltaTime);
//无关的逻辑

//设置动画蓝图中bIsCrouched变量的值,从玩家角色中获取
bIsCrouched = BlasterCharacter->bIsCrouched;
}

最后进入动画蓝图,修改过渡条件,即可完成功能

image-20230425100717864

最后看一下效果

image-20230425100943038


文章作者: John Doe
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 John Doe !
  目录