写在前面
Crouch
即蹲下, 是FPS游戏里的另一个重要动作。
角色下蹲,同时还意味着角色的碰撞体积也变小,但是好消息是,Character类已经给了我们现成的Crouch
函数和UnCrouch
函数了,不仅如此,它还提供了bIsCrouched
状态位来告诉我们角色是否是Crouched状态,同时,这个状态做到了服务器和客户端同步,代表我们不需要额外去Replicated它了。
注意,这不仅意味着,在服务端到客户端不需要复制,从客户端1到服务端再到客户端也无需再复制,做全套了。这是不是有点像角色的移动呢,角色在客户端的移动也是多端同步的毕竟。
确定Crouch标志
首先我们先在AnimeInstance里面写上标志位:
c++
// header
// 是否在Crouch
UPROPERTY(BlueprintReadOnly, Category = Character, meta = (AllowPrivateAccess = "true"))
bool bIsCrouched;
// c++
bIsCrouched = BlasterCharacter->bIsCrouched; // 是否在Crouch
而在BlasterCharacter里,我们需要做两件事,一件是按键绑定,第二件是让角色开启CanCrouch
。
c++
// header
void Crouch();
void UnCrouch();
// cpp
// Sets default values
ABlasterCharacter::ABlasterCharacter()
{
// ...
// 设置让角色可以Crouch
this->GetMovementComponent()->NavAgentProps.bCanCrouch = true;
}
// Called to bind functionality to input
void ABlasterCharacter::SetupPlayerInputComponent(UInputComponent *PlayerInputComponent)
{
Super::SetupPlayerInputComponent(PlayerInputComponent);
// ...
// 按下键位 开始Crouch
PlayerInputComponent->BindAction("Crouch", IE_Pressed, this, &ThisClass::Crouch);
// 松开键位 开始Crouch
PlayerInputComponent->BindAction("Crouch", IE_Released, this, &ThisClass::UnCrouch);
}
完成了。
动画蓝图
和之前的动作不同,Crouch动作无需再左右倾斜,所以只要有一个方向Direction即可。
我们先做1D Blend Space
,

左右不分很简单,其实只要看看你的preview的方向和角色运动的方向是不是一样就可以了。



Idle -> Crouch Walk
Crouch Walk -> Idle