老样子先看输入
1 2 3 4 5 6 7 8 9 10 11 12 13 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 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 = BlasterCharacter->bIsCrouched; }
最后进入动画蓝图,修改过渡条件,即可完成功能
最后看一下效果