问题是在服务端,我创建了一个obj,然后spwan它,但是在客户端我怎么知道这个对象什么时候spwaned,我想知道有没有spwan回调函数,不好意思我的英文. 在此先感谢您的帮助!
3 回答
这可能是您正在寻找的: 自定义生成回调
每当您使用它时,您现在负责在所有客户端上实例化新对象,您可以像给出的示例中那样使用简单的 Instantiate() 来做到这一点。
然而,有两个重要的警告:
- 由于某种原因,主机上永远不会调用 spawn 回调,因此,如果您在回调中对对象进行任何初始化,请注意在主机上调用 Spawn() 后您可能仍需执行此操作。
- 对于这个,我把头撞到了墙上,但似乎调用 RegisterSpawnHandler() 也注册了 prefab,所以听起来很不可思议,如果你在任何其他地方为同一个对象调用 RegisterPrefab()在您的代码(包括 NetworkManager)中,您的回调将永远不会被调用。至少这是我在 2017.1 的经历。
我不知道您是否可以直接获取到 spawn 函数客户端的回调,但您可以将继承 NetworkBehaviour 的脚本附加到生成的对象,并将其添加到脚本中:
public class MySpawnedObject : NetworkBehaviour
{
void Awake()
{
if (!isServer)
//do what you want with your client
}
}
但不要忘记,如果当前可执行文件是主机,isServer 返回 true,而 UNET 将主机视为服务器和客户端,您也可以使用 isClient 来触发主机和客户端。
if (isClient)
I don't know any direct way to know that player has spawned at server but You can fire an event from server that can run on each client when you instantiate your player. For this reason you can use ClientRPC attribute
ClientRpc- The [ClientRpc] attribute is called on the server and executed on all of the clients that are currently connected to the server for a given object. [ClientRpc] is most commonly used to notify the clients of game changes like a change in score or that they have died (to play sound and death animations on all players' screens).
Like this script attached to your local player
public class MyLocalPlayer: NetworkBehaviour
{
int counter;
[ClientRpc]
public void PlayerSpawned(int extra)
{
Debug.Log("a player has spawned");
}
}