Unity Netcode中能否创建List或Array类型的网络变量?
Unity Netcode中List/Array类型网络变量的实现
在Unity Netcode环境下,完全可以实现List或Array类型的网络变量,但两者的实现方式有所区别:
1. 数组(Array)
Netcode直接支持将原生数组作为NetworkVariable的泛型参数,比如NetworkVariable<int[]>、NetworkVariable<Vector3[]>等。需要注意的是:
- 数组属于引用类型,Netcode默认只检测数组引用的变化,不会自动同步数组内部元素的修改。
- 修改数组元素后,必须手动调用
NetworkVariable.SetValue()重新赋值整个数组,才能触发同步。
示例代码:
public class ScoreManager : NetworkBehaviour { // 初始化一个长度为3的整数数组网络变量 private NetworkVariable<int[]> _playerScores = new NetworkVariable<int[]>(new int[3]); // 服务器端更新指定索引的分数 public void UpdatePlayerScore(int playerIndex, int newScore) { if (!IsServer) return; var currentScores = _playerScores.Value; currentScores[playerIndex] = newScore; // 重新赋值触发同步 _playerScores.SetValue(currentScores); } }
2. 列表(List)
原生List<T>不能直接作为NetworkVariable的泛型参数,Netcode提供了专门的NetworkList<T>类型来实现列表的网络同步,它的优势在于:
- 自动同步列表的增、删、改操作,无需手动调用SetValue。
- 支持更细粒度的同步,只同步变化的元素,效率更高。
示例代码:
public class InventoryManager : NetworkBehaviour { // 字符串类型的网络列表,用于存储物品名称 private NetworkList<string> _inventoryItems = new NetworkList<string>(); // 服务器端添加物品 public void AddInventoryItem(string itemName) { if (!IsServer) return; _inventoryItems.Add(itemName); } // 服务器端移除物品 public void RemoveInventoryItem(string itemName) { if (!IsServer) return; _inventoryItems.Remove(itemName); } }
注意事项
NetworkList<T>中的泛型参数T必须是Netcode支持网络序列化的类型,包括基础数据类型、自定义可序列化结构体等。- 若需要频繁修改集合内部元素,优先使用
NetworkList<T>,避免数组每次修改都要重新赋值的性能开销。 - 所有网络集合的修改操作必须在服务器端执行,客户端仅能读取数据;若需客户端修改,需手动配置
WritePermission,但这种方式容易引发同步冲突,不推荐。
内容的提问来源于stack exchange,提问作者Callumari
相关产品推荐
相关产品推荐

