MLAPI系列 - 03 - Objects【对象生成】

Object【对象生成】

在Unity中,通常使用Instantiate功能。创建游戏对象Instantiate将只在玩家的本地机器上创建该对象。Spawning在Netcode
for GameObjects (Netcode)中,意思是创建一个在所有客户端和服务器之间共享的对象。

1 注册一个网络预置【Registering】

要生成一个对象,它必须首先注册为一个网络预设:

从你想要生成的物体中创建一个预置。

确保对象有一个NetworkObject组件在上面。

这NetworkObject组件有一个PrefabHash这是一个唯一的名称,Netcode使用它来查找要在客户机上生成的正确对象。默认情况下,这是对象的名称,但是可以根据需要进行更改。

将你的预设添加到NetworkManager的NetworkPrefabs列表.

2 生成一个网络预置【Spawning】

Netcode使用服务器授权网络模型,因此只能在服务器/主机上生成对象。要生成一个对象,首先从你的预置中实例化该对象,然后调用NetworkObject应该附加到预设的组件。这只能在服务器上完成,因为对象会自动在其他客户机上复制。默认情况下,新生成的对象归服务器所有。看见所有权了解更多信息。

以下是生成对象(具有服务器所有权)的示例:

GameObject go = Instantiate(myPrefab, Vector3.zero, Quaternion.identity);
go.GetComponent<NetworkObject>().Spawn();

这.Spawn()方法有两个可选参数,都有默认值:

public void Spawn(Stream spawnPayload = null, bool destroyWithScene = false);
参数 描述
spawnPayload System.IO.Stream,流数据,可以在中检索NetworkStart()在生成此对象时同步一次值。有效负载数据仅对已连接的客户端可用。如果客户端稍后连接,它们将不会获得有效负载数据。
destroyWithScene 如果设置为true,对象将在场景切换时被销毁。这只能在spawn调用中设置。

3 销毁/卸载【Destroying / Despawning】

当一个生成对象在服务器/主机上被销毁时,Netcode也会自动在所有客户机上销毁它。

当客户端断开连接时,该客户端拥有的所有对象都将被销毁。如果不希望对象发生这种情况,请将NetworkObject的DontDestroyWithOwner字段设置为true。

3.1 卸载对象【Despawning】

要在所有客户端上取消一个联网对象,但在服务器调用中保留它NetworkObject.Despawn在服务器上。如果需要的话,还可以通过另一个spawn调用来再次生成一个被派生的对象。

客户端永远不应该对网络对象本身调用destroy(这是不支持的)。要使用客户端权限销毁对象,让客户端向服务器发送RPC,这允许服务器销毁对象。

您不能仅在特定客户端上取消对象。如果您想在某些客户端上隐藏某个对象,但在其他客户端上显示它,请使用【对象可见性】.

为了更好地控制对象的生命周期,Netcode内置了对象池。【对象池

4 场景对象【Scene Objects】

场景中的任何对象都处于活动状态NetworkObjectNetcode将自动复制组件。不需要手动生成它们。

有二定义场景对象如何同步的模式。

4.1 软同步【SoftSync】

SoftSync是同步场景对象的默认和推荐模式。

使用时SoftSyncNetcode只是将现有的场景对象相互同步。这允许场景对象成为非预设对象,并且不会被替换,从而保持它们的序列化数据。

4.2 预同步【PrefabSync】

旧版本
PrefabSync可以通过在NetworkManager中勾选PrefabSync手动启用。如果SceneManagement被禁用,也将使用PrefabSync。

新版本[pre-6]
PrefabSync可以在NetworkManager中手动启用,通过勾选EnableSceneManagement。如果SceneManagement已禁用,SoftSync会被禁用,PrefabSync将被使用。

如果启用,每个带有NetworkObject组件必须是预置的,并且必须在NetworkPrefabs列表。
当客户端启动时,Netcode将使用NetworkObject组件,并从NetworkPrefabs生成列表。这意味着客户机上的序列化数据会丢失。
因此,建议将序列化数据放在NetworkVariable的PrefabSync仅推荐用于多项目设置.

【NetworkManager.NetworkConfig】

class NetworkConfig
{
    
    

//...

/// <summary>
/// 启用场景管理。 这将允许网络场景切换和自动场景差异校正连接。  
/// 禁用此功能后,软同步场景对象将无法工作。 
/// 这意味着禁用scenmanagement也会启用PrefabSync.
/// </summary>
[Tooltip("Enables scene management. This will allow network scene switches and automatic scene difference corrections upon connect.\n" + "SoftSynced scene objects wont work with this disabled. That means that disabling SceneManagement also enables PrefabSync.")]
public bool EnableSceneManagement = true;

//...

}

猜你喜欢

转载自blog.csdn.net/weixin_38531633/article/details/124005289
今日推荐