Unity中能否通过扩展方法直接修改Vector3结构体的值?
问题解答
核心原因是Vector3是值类型(结构体),C#里值类型默认按值传递——你的扩展方法里的vector参数其实是原变量的副本,修改副本的数值自然不会影响到原变量。
那有没有办法通过扩展方法直接修改原Vector3的值?答案是不行,因为C#的语法规则不允许扩展方法的this参数使用ref修饰符,无法实现按引用传递原值类型实例,也就没法直接修改原变量。
你现在用的赋值方式(myVector = myVector.Floor();)其实是Unity值类型操作的常规写法,而且Unity本身已经提供了现成的静态方法可以直接用:
myVector = Vector3.Floor(myVector);
如果非要追求“直接修改”的调用形式,只能放弃扩展方法,写一个带ref参数的静态方法:
public static void Floor(ref Vector3 vector) { vector.x = Mathf.Floor(vector.x); vector.y = Mathf.Floor(vector.y); vector.z = Mathf.Floor(vector.z); }
调用时写成:
Floor(ref myVector);
内容的提问来源于stack exchange,提问作者ProtoTyPus
相关产品推荐
相关产品推荐

