【问题标题】:[Unet]Unity Unet Spwan CallBack function[Unet]Unity Unet Spwan回调函数
【发布时间】:2017-06-08 08:32:09
【问题描述】:

问题是在服务端,我创建了一个obj,然后spwan它,但是在客户端我怎么知道这个对象什么时候Spwaned,我想知道有没有spwan回调函数,很抱歉我的英语。提前感谢您的帮助!

【问题讨论】:

    标签: unet


    【解决方案1】:

    这可能是您正在寻找的: Custom Spawning callbacks

    每当您使用它时,您现在都负责在所有客户端上实例化新对象,您可以像给出的示例中那样使用简单的 Instantiate() 来做到这一点。

    但是有两个重要的警告:

    • 出于某种原因,主机上永远不会调用 spawn 回调,因此,如果您在回调中对对象进行任何初始化,请注意,在主机上调用 Spawn() 后您可能仍需执行此操作.
    • 为此,我把头撞到了墙上,但调用 RegisterSpawnHandler() 似乎也注册了预制件,所以如果你调用 RegisterPrefab,这听起来很不可思议() 对于代码中任何其他位置的相同对象(包括 NetworkManager),您的回调将永远不会被调用。至少这是我在 2017.1 的经历。

    【讨论】:

      【解决方案2】:

      我不知道你是否可以直接获取到 spawn 函数客户端的回调,但你可以将一个继承 NetworkBehaviour 的脚本附加到生成的对象,并将其添加到脚本中:

      public class MySpawnedObject : NetworkBehaviour
      {
           void Awake()
           {
                if (!isServer)
                   //do what you want with your client
           }
      }
      

      但不要忘记,如果当前可执行文件是主机,isServer 返回 true,而 UNET 将主机视为服务器和客户端,您也可以使用 isClient 来触发主机和客户端。

      if (isClient)
      

      【讨论】:

      • 好的谢谢你的回复,我想知道Unet里面有没有类似的回调函数,因为在客户端,我不知道spwan什么时候生成的对象,当前的Unet只有知道LocalPlayer生成的时候,public override void OnStartLocalPlayer(),但是spwan却不行,如果要添加spwan对象! IsServer 不太方便
      • 对不起,我无法理解你的问题.. :/
      【解决方案3】:

      我不知道任何直接的方法可以知道该玩家已在服务器上生成,但您可以在实例化您的玩家时从服务器触发一个可以在每个客户端上运行的事件。因此,您可以使用 ClientRPC 属性

      ClientRpc- 在服务器上调用 [ClientRpc] 属性并且 在当前连接到的所有客户端上执行 给定对象的服务器。 [ClientRpc] 最常用于通知 游戏的客户变化就像分数的变化或他们有 死亡(在所有玩家的屏幕上播放声音和死亡动画)。

      喜欢这个脚本附加到你的本地播放器

      public class MyLocalPlayer: NetworkBehaviour
      {
          int counter;
          [ClientRpc]
          public void PlayerSpawned(int extra)
          {
              Debug.Log("a player has spawned");
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 2016-08-20
        • 1970-01-01
        • 1970-01-01
        • 2018-07-06
        • 2018-09-17
        • 1970-01-01
        • 1970-01-01
        • 2022-08-04
        • 2020-06-17
        相关资源
        最近更新 更多