在射击游戏中,我想同时实现第一人称和第三人称的效果,这样在PVP模式中我希望是仅能第一人称,而在PVE模式中,使用第一人称增加代入感,或者使用第三人称纵览全局并获得更稳定的视角。
在第一人称中,我希望做到的效果是玩家角色随鼠标的移动进行旋转,同时将旋转的角度同步到其他客户端,使得其它角色也能看到你在旋转。
在第三人称中,因为我需要使用鼠标观察四周移动视角,所以实际上我并不希望角色随着鼠标的朝向移动,那样对于玩家来说是一个困扰。我希望的效果是,玩家随着键盘的控制方向移动,而不是鼠标,此时本地玩家A移动鼠标后,其他客户端的玩家并不会发现在他们的显示器上,玩家A控制的角色发生了旋转。但若此时玩家A在键盘上输入相反的方向进行位移,那么其他客户端的玩家应该发现在他们的显示器上,玩家A控制的角色发生了相反的旋转。
这两个效果是我今天想要完成的。
来,先绑定输入
1 2
| EnhancedInputComponent->BindAction(IA_ChangeView, ETriggerEvent::Triggered, this, &ABlasterCharacter::InputShiftView);
|
直接看InputShiftView不墨迹
1 2 3 4 5 6 7 8 9 10 11 12
| void ABlasterCharacter::InputShiftView(const FInputActionValue& InputValue) { if(HasAuthority()) { ClientChangeView(); return; } ServerChangeView(); }
|
然后再看ServerChangeView_Implementation
1 2 3 4 5 6 7
| void ABlasterCharacter::ServerChangeView_Implementation() { ChangeCameraView(); ClientChangeView(); }
|
ClientRPC直接执行ChangeCameraView使得在客户端执行业务逻辑
1 2 3 4
| void ABlasterCharacter::ClientChangeView_Implementation() { ChangeCameraView(); }
|
最后由ChangeCameraView真正的直接去修改视角和控制旋转
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| void ABlasterCharacter::ChangeCameraView() { if (FollowCamera->IsActive()) { FollowCamera->SetActive(false); FollowCamera->Deactivate(); TPSCamera->SetActive(true); TPSCamera->Activate(); GetCharacterMovement()->bOrientRotationToMovement = true; bUseControllerRotationYaw = false; } else { TPSCamera->SetActive(false); TPSCamera->Deactivate(); FollowCamera->SetActive(true); FollowCamera->Activate(); GetCharacterMovement()->bOrientRotationToMovement = false; bUseControllerRotationYaw = true;
} }
|
到这逻辑就写完了,不过记得可以在角色构造里面自定义初始化一下关于视角的设置,设置成自己喜欢的方式就行,不一定要和我一样
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| ABlasterCharacter::ABlasterCharacter() { PrimaryActorTick.bCanEverTick = true;
FollowCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("FollowCamera"));
FollowCamera->SetupAttachment(GetMesh(), FName(TEXT("FollowCameraSocket")));
TPSCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("TPSCamera")); TPSCamera->SetupAttachment(CameraBoom);
FollowCamera->bUsePawnControlRotation = true;
FollowCamera->SetActive(true); FollowCamera->Activate(); TPSCamera->SetActive(false); TPSCamera->Deactivate();
}
|
与本篇无关的函数内容这里精简了,至于摄像机的位置大家自己摆一下,摄像机视角的变换和旋转同步问题到这里应该就解决了,至于第一人称视角容易和角色穿模的问题我们下篇再讨论有什么处理方式。最后放一张效果图
