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
相关产品推荐
相关产品推荐

