Unity多人FPS客户端/服务器交互问题



我有一个简单的FPS,玩家可以在其中开枪。我想让客户看到弹孔。我试图通过在客户端试图开火时调用服务器端方法来实现这一点。然后,服务器端的方法应该从玩家的相机中进行光线投射,并产生一个弹孔供所有人看到。。

我可以通过将播放器作为参数传递给服务器方法来部分实现这一点。然而,由于我的光线投射需要基于玩家的相机进行,弹孔最终会出现在角色的高度,因为它使用的是玩家而不是相机。

它不允许我把相机穿过。我也尝试过创建一个名为bullet spawn的空游戏对象并将其传递出去,但我得到了一个"对象引用未设置为对象实例"。对于我试图传递给服务器端方法的玩家的任何Child元素,似乎都会出现同样的错误。

我不确定实现这一目标的正确方法。

void Update()
{
if (isLocalPlayer)
{
if (Input.GetButton("Fire1"))
{
CmdFire(BulletSpawn);
}
}
}
[Command]
void CmdFire(GameObject Player)
{
Ray shooterRay = new Ray(Player.transform.position, Player.transform.forward);
if (Physics.Raycast(shooterRay, out Hit, 10000))
{
Debug.Log("player hit");
GameObject Bullet_Hole = (GameObject)Instantiate(BulletHole_Prefab, Hit.point, Quaternion.FromToRotation(Vector3.up, Hit.point));
NetworkServer.Spawn(Bullet_Hole);
}
}

这样想吧。你需要发射什么武器?你需要射击点和射击方向(在你的简单情况下)。所以试着传递这些信息。你的CmdFire应该看起来像void CmdFire(矢量3发射点,矢量3发射方向)。请记住,当您传递玩家游戏对象时,它会被序列化并发送到服务器,这会导致大量不必要的网络流量。对于命令,坚持使用值类型和简单对象。

这就是我最终找到解决方案的原因。谢谢你的建议。我只是按照您的建议传递了两个Vector3参数,它们表示光线投射的位置和方向。我现在可以从客户端和服务器上拍摄,也可以看到两者上的弹孔。以下是修复它的代码,以防以后有人遇到这种情况:

void Update() {
if (isLocalPlayer) {
if (Input.GetButton("Fire1")) {
Vector3 FiringSpot = PlayerCam.transform.position;
Vector3 FireDirection = PlayerCam.transform.forward;
CmdFire(FiringSpot, FireDirection);
}
}
}
[Command]
void CmdFire(Vector3 firingPoint, Vector3 firingDirection) {
Ray shooterRay = new Ray(firingPoint, firingDirection);
if (Physics.Raycast(shooterRay, out Hit, 10000)) {
GameObject Bullet_Hole = (GameObject)Instantiate(bullet_Hole_Prefab, Hit.point, Quaternion.FromToRotation(Vector3.up, Hit.point));
NetworkServer.Spawn(Bullet_Hole);
Destroy(Bullet_Hole, 10);
}
}

最新更新