【问题标题】:Unity: Spawn object from client to all clientsUnity:从客户端生成对象到所有客户端
【发布时间】:2018-02-03 00:07:23
【问题描述】:

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

使用 Unity 5.6

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

  • 我已经在 NetworkManager 中注册了 Prefab。
  • Prefab 有一个 NetworkIdentity,其中 ServerOnlyfalseLocalPlayerAuthorityfalse >.
  • Prefab 有一个 NetworkTransform,其 NetworkSendRate = 0 和一个 TransformSyncModeSync RigidBody2D。李>
  • 玩家使用 [Command] 方法并使用 NetworkServer.Spawn (bulletInstance) 发射子弹
    • 在调用 NetworkServer.Spawn 之前,我将 velocity 分配给 bulletInstance 的 RigidBody2D
    • 子弹脚本类是一个NetworkBehaviour
    • 玩家拥有 NetworkIdentityLocalPlayerAuthority 为 true
    • 播放器脚本类是一个NetworkBehaviour

【问题讨论】:

  • 你在bulletPrefab 中添加了networkidentiy 吗?第二种方法,您可以使用带有 [RpcClient] RpcSpawnABullet(vector) 的方法进入 [Command]CmdFire。
  • 你是怎么调用cmdFire的

标签: c# unity3d unity5 unity3d-unet


【解决方案1】:

在 Unet 中,

1。只有 SERVER 可以生成任何对象 - 故事结束

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

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

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

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

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

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

NetworkServer.SpawnWithClientAuthority(treeGo, conn);

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

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

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

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

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

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

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

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

原来如此。

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

你应该打电话

NetworkServer.SpawnWithClientAuthority(treeGo, conn);

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-15
    • 2018-02-24
    • 2015-01-08
    • 1970-01-01
    • 1970-01-01
    • 2022-12-13
    • 1970-01-01
    • 2017-05-31
    相关资源
    最近更新 更多