You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 17:24:16