【发布时间】:2017-04-19 01:49:36
【问题描述】:
我目前正在开展一个项目,我的所有玩家都使用不同的相机。
我一开始想用UCameraComponent,但是每个相机都必须绕着某个点转动,而不是随着pawns的移动而移动。
所以我决定在我的 pawn 的 BeginPlay() 中生成一个相机 Actor。
void AMyCharacter::BeginPlay()
{
Super::BeginPlay();
if (!hasCamera) { // Camera not set yet
FVector vectpos; // Target position of the camera
vectpos.X = -1130;
vectpos.Y = 10;
vectpos.Z = 565;
FRotator rotation;
rotation.Pitch = -22;
rotation.Yaw = 0;
rotation.Roll = 0;
APlayerController* controller = Cast<APlayerController>(GetController());
if (controller == NULL) // When I'm on client, the GetController() return NULL.
{
// Trying to find the controller of my client
for (FConstPlayerControllerIterator Iterator = GetWorld()->GetPlayerControllerIterator(); Iterator; ++Iterator)
{
controller = *Iterator;
//On client, there is only 1 controller according to the documentation.
}
}
if (controller != NULL)
{
controller->SetViewTarget(Camera); // Set the view with the new camera
}
SetCamera(true); // Call and RPC Function to update the hasCamera variable
}
}
这适用于第一个玩家,之后取决于它。有时,第二个玩家的摄像头工作正常,但有时,他通过错误的摄像头观看,并且相机变量与他正在查看的不同。有时,当新玩家加入游戏时,它会成为第一个/第二个玩家看错了镜头。
这是我们用来在客户端和服务器(创建游戏的第一个客户端)之间建立 LAN 连接的 GameInstance 蓝图
如果有人能找到相机无法按预期工作的原因,那就太好了!提前感谢大家的帮助。
【问题讨论】:
-
网络服务器有所有的播放器控制器,你总是拿最后一个。尝试使用
UEngine::GetFirstLocalPlayerController -
感谢您的回复,我试过了,它适用于服务器,但是当我与第二个玩家连接时,我的服务器失去了他的相机。当我与第三位玩家联系时,每个人都会失去他的相机。可能是因为正在客户端和服务器上调用 BeginPlay,而服务器将 Camera 变量的值更改为错误的变量?有没有办法让我们通过它查看当前的相机?
-
BeginPlay将在服务器上为每个玩家调用。起初 -APawn具有功能GetController。所以你不需要在某个地方寻找它。其次,AController有IsLocalController,所以你可以找出是本地还是网络播放器控制器。 -
我已经尝试过这些,
GetController()仅适用于服务器,每个调用它的客户端都会得到一个 NULL 而不是他的控制器,我试图寻找本地控制器,但更糟糕的是,我是检查所有控制器并获取本地控制器,然后生成一个摄像头,但最后,我所有的客户都没有摄像头。 -
我认为你做错了。
ACharacter是世界上的一种角色表示,因此您将为每个玩家拥有一个。因此,将您的相机代码放入其中很奇怪。 IMO,您应该制作AMyPlayerController并从中控制相机。显然,仅适用于本地玩家。
标签: c++ networking unreal-engine4 unreal-blueprint