自定义生成函数

您可以使用生成处理函数来自定义在客户端创建生成的游戏对象时的默认行为。生成处理函数确保您完全控制如何生成游戏对象,以及如何销毁它。

使用 NetworkClient.RegisterSpawnHandlerNetworkClient.RegisterPrefab 来注册生成和销毁客户端游戏对象的函数。服务器直接创建游戏对象,然后通过此功能在客户端生成它们。这些函数接受资产 ID 或预制体以及两个函数委托:一个用于处理在客户端创建游戏对象,另一个用于处理在客户端销毁游戏对象。资产 ID 可以是动态的,也可以是您想要生成的预制体游戏对象上找到的资产 ID。

生成 / 销毁委托看起来类似于:

生成处理函数

GameObject SpawnDelegate(Vector3 position, System.Guid assetId) 
{
    // do stuff here
}

GameObject SpawnDelegate(SpawnMessage msg) 
{
    // do stuff here
}

销毁处理函数

void UnSpawnDelegate(GameObject spawned) 
{
    // do stuff here
}

当预制体保存时,其 assetId 字段将自动设置。如果要在运行时创建预制体,您将需要生成一个新的 GUID。

在运行时生成预制体

使用现有预制体

在服务器上生成

生成函数本身是使用委托签名实现的。这是硬币生成器。SpawnCreature 看起来一样,但具有不同的生成逻辑:

在使用自定义生成函数时,有时可以无需销毁游戏对象而取消生成它们。这可以通过调用 NetworkServer.UnSpawn 来实现。这会导致对象在服务器上被 Reset,并向客户端发送 ObjectDestroyMessageObjectDestroyMessage 将导致在客户端调用自定义取消生成函数。如果没有取消生成函数,则对象将被 Destroy

注意,在主机上,本地客户端不会为游戏对象生成,因为它们已经存在于服务器上。这也意味着不会调用生成或销毁处理函数。

游戏对象池

为了避免频繁实例化和销毁使用频繁的游戏对象,将它们放入对象池可能会更有用。

以下是一个设置简单游戏对象池系统以及自定义生成处理程序的示例。生成和销毁将游戏对象放入或移出对象池。

要使用此对象池,请将PrefabPool组件(上面的代码)添加到NetworkManager。然后,将要多次生成的预制体拖放到Prefab字段中。

我们可以修改我们的坦克示例来展示对象池系统。

打开Tank.cs并找到CmdFire函数:

不要实例化,而是从对象池中获取一个预制体:

Projectile.cs当前通过GameObject.Destroy销毁自身:

相反,我们只需将其取消生成并将其返回到对象池:

按下播放并发射一些抛射物。注意到没有任何实例化。相反,NetworkManager有一组被禁用的子对象,直到需要它们为止。

最后更新于

这有帮助吗?