Unity:从客户端到所有客户端的Spawn对象

时间:2017-08-25 01:02:47

标签: c# unity3d unity5 unity3d-unet

我有一个射击子弹的玩家,但是当射击的玩家是主持人时,子弹只会被发送给所有客户。

使用 Unity 5.6

到目前为止我所拥有的......

  • 我已经在NetworkManager中注册了预制件。
  • Prefab在 false 中有 NetworkIdentity ServerOnly false LocalPlayerAuthority >
  • Prefab有 NetworkTransform NetworkSendRate = 0 TransformSyncMode 同步RigidBody2D
  • 播放器使用 [Command] 并使用 NetworkServer.Spawn(bulletInstance)方法射击子弹
    • 在调用 NetworkServer.Spawn 之前,我将速度分配给bulletInstance的 RigidBody2D
    • Bullet脚本类是 NetworkBehaviour
    • 玩家 NetworkIdentity LocalPlayerAuthority 为真
    • 播放器脚本类是 NetworkBehaviour

enter image description here

1 个答案:

答案 0 :(得分:2)

在Unet中,

1。只有SERVER可以产生任何对象-故事的结尾

在Unet中,服务器生成对象,仅此而已。故事结束。

2。您必须拥有“玩家”对象。每个客户都必须有一个玩家对象。故事结束。

“玩家”对象实际上不是坦克或任何东西,这是完全正常的-它可以是每个客户都有一个的空游戏对象(通常称为“抽象玩家对象”)。

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

使用客户权限生成对象非常容易。只需转到doco页面Manual / UNetSpawning.html并向下滚动到 代码(CSharp):

NetworkServer.SpawnWithClientAuthority(treeGo, conn);

在那里解释了(真的就是所有的一切)。

4。假设某个特定的玩家X拥有对该对象的权限。当然,只有在X加入后才能生成对象!

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

当然,在X真正加入游戏之前,这是没有意义的!见第二点!

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

  

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

  

示例2-客户端(例如,客户端JohnSmith)想要生成JohnSmith将对其拥有权限的对象。客户端(JohnSmith)非常简单地要求服务器生成对象。 “询问服务器”仅表示发送Command

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

这就是协议。

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

您应该打电话

NetworkServer.SpawnWithClientAuthority(treeGo, conn);

(在此doco页面上搜索该内容:Manual / UNetSpawning.html)

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