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

为何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的修改生效,有两种常用方式:

  1. 让方法返回修改后的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;
}
  1. 使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 06:05:17