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

Unity中类变量按引用而非值传递的问题排查

问题解决:让每个Block实例拥有独立的FaceIndex列表

你遇到的问题核心是C#中引用类型的传递规则:List<T>属于引用类型,所谓的"按值传递"传递的是引用的副本,而不是整个列表的副本。所以所有Block实例的faceDirections字段都会指向同一个List对象,修改原List时所有实例都会同步变化。

解决方法

只需要在Block的构造函数里,创建一个新的List来复制传入的列表元素,让每个实例持有独立的列表即可。修改后的Block类构造函数如下:

public class Block
{
    public List<FaceIndex> faceDirections;

    public enum FaceIndex : int
    {
        East = 0,
        West = 1,
        Top = 2,
        Bottom = 3,
        North = 4,
        South = 5,
    }

    public Block(List<FaceIndex> faceDirections)
    {
        // 创建新List并复制原列表的所有元素
        this.faceDirections = new List<FaceIndex>(faceDirections);
        // 或者用ToList()方法实现同样效果:
        // this.faceDirections = faceDirections.ToList();
    }
}

这样每次实例化Block时,都会生成一个独立的List副本,后续修改原blockFaceDirections列表或者某个Block实例的faceDirections列表,都不会影响其他实例。

补充说明

你看到的"Unity默认按值传递"没错,但要区分值类型和引用类型:

  • 值类型(比如int、float、struct)按值传递时,会复制整个数据,修改副本不影响原数据;
  • 引用类型(比如List、自定义类)按值传递时,复制的是指向数据的引用,所以多个引用依然指向同一个数据对象,修改数据会影响所有持有该引用的变量。

内容的提问来源于stack exchange,提问作者David Martin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 02:17:16