[Unet]Unity Unet Spwan回调函数

Posted

技术标签:

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

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

【问题讨论】:

【参考方案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");
    


【讨论】:

以上是关于[Unet]Unity Unet Spwan回调函数的主要内容,如果未能解决你的问题,请参考以下文章

Unity5.1 新的网络引擎UNET UNET 官方推荐Demo案例

Unity模拟弹幕——Unet

在 Unity Networking - UNET 中同步复杂的游戏对象

Unity Networking-UNet 中的附加场景加载

Unity 5 - UNET - 将拖动的游戏对象同步为客户端(HL2 重力枪风格)

引用具有网络标识 Unity UNET 的对象的子对象?