1

我有一个射击子弹的玩家,但只有当射击的玩家是主机时,子弹才会生成给所有客户端。

使用Unity 5.6

我目前所拥有的...

  • 我已经在 NetworkManager 中注册了 Prefab。
  • Prefab 有一个NetworkIdentity,其中ServerOnlyfalseLocalPlayerAuthorityfalse
  • Prefab 有一个NetworkTransform和一个NetworkSendRate = 0和一个TransformSyncMode同步 RigidBody2D
  • 玩家使用方法[Command]并使用NetworkServer.Spawn (bulletInstance)射击子弹
    • 在调用NetworkServer.Spawn之前,我将速度分配给bulletInstance的 RigidBody2D。
    • Bullet Script 类是一种NetworkBehaviour
    • 玩家的NetworkIdentityLocalPlayerAuthority为 true
    • Player Script Class 是一个NetworkBehaviour

在此处输入图像描述

4

1 回答 1

3

在 Unet 中,

1. 只有服务器可以产生任何对象 - 故事结束

在 Unet 中,服务器会产生对象,仅此而已。故事结局。

2. 你必须有“玩家”对象。每个客户端绝对必须有一个“玩家”对象。

“玩家”对象实际上不是坦克或 Biped 是完全正常的,而只是一个空的游戏对象。(有时称为“抽象玩家对象”)。

每个客户端都必须有一个“玩家对象”——通常只是一个空的游戏对象

3. 关于生成具有客户端权限的对象 - 参见第 1 点。

生成具有客户端权限的对象非常容易。只需转到文档页面 Manual/UNetSpawning.html 并向下滚动到代码(CSharp):

NetworkServer.SpawnWithClientAuthority(treeGo, conn);

那里有解释(真的就是这样)。

4. 假设某个特定玩家 X 将拥有该对象的权限。当然,在 X 加入之前,您不能生成对象!

在上面的代码行中,人们经常问你怎么知道NetworkConnection要使用哪个“conn” ?

当然,直到X真正加入游戏才有意义!见第2点!

所以你可能会做这样的事情......

示例 1 - 只有一个特定客户是您的“母舰”。当然,很明显,服务器必须知道NetworkConnection那个客户端。您将把它保存在一个变量networkConnectionToMothership中。因此,在本例中,您可以使用“conn”。

或者

示例 2 - 一个客户(例如,客户 JohnSmith)想要生成一个 JohnSmith 将拥有权限的对象。很简单,客户端 (JohnSmith) 要求服务器生成对象。“询问服务器”只是意味着发送一个Command.

在任何“命令”(即在服务器上运行)中,您实际上都拥有connectionToClient为您提供所需“conn”的属性!

所以这就是交易。

对于这个特定问题,在您的代码中,您正在调用NetworkServer.spawn.

你应该打电话

NetworkServer.SpawnWithClientAuthority(treeGo, conn);

(在此文档页面上搜索:Manual/UNetSpawning.html)

我已经在上面的示例 (2) 中解释了您如何知道要使用什么“conn”。

于 2018-08-10T04:46:57.423 回答