为何Unity C#中可修改自定义对象属性却无法修改Vector3属性?
为何C#中普通对象属性可修改,Unity Vector3属性修改无效?
核心原因在于C#的值类型与引用类型的传参差异:
- 自定义类属于引用类型:方法传参时传递的是对象引用的副本(本质还是值传递),但这个副本指向堆内存里的同一个对象实例,所以在方法中修改对象属性,会直接作用于原对象。
- Unity的
Vector3是值类型(struct结构体):值类型在传参时会创建整个实例的完整副本,方法里修改的只是这个副本的属性,原实例完全不受影响。
结合你的测试代码来看:Start方法里创建的Vector3 v是值类型实例,调用setVector3(v)时,会把v的完整拷贝传入方法,方法内的v.x = 5只是修改了副本的x值,原v的x依然是初始的0,所以Debug.Log(v)输出的还是(0.0, 0.0, 0.0)。
如果想让Vector3的修改生效,有两种常用方式:
- 让方法返回修改后的Vector3,再赋值给原变量:
void Start() { Vector3 v = new Vector3(0,0,0); v = setVector3(v); Debug.Log(v); } Vector3 setVector3(Vector3 v) { v.x = 5; return v; }
- 使用
ref关键字传递引用,让方法直接操作原实例:
void Start() { Vector3 v = new Vector3(0,0,0); setVector3(ref v); Debug.Log(v); } void setVector3(ref Vector3 v) { v.x = 5; }
内容的提问来源于stack exchange,提问作者user15698505
相关产品推荐
相关产品推荐

