如何在静态工具函数内部修改调用实例?Vector3扩展方法失效排查
解决Vector3扩展方法无法修改实例的问题
为什么你的代码不生效?
因为Vector3是值类型(struct),C#里值类型的参数默认是值传递——也就是说你扩展方法里的this Vector3 v其实是transform.position的一个副本。你在方法里给v赋值新的Vector3,只是修改了这个副本,原有的transform.position根本没被改动。哪怕你返回了新的Vector3,只要没把返回值重新赋值给transform.position,就不会有任何效果。
两种可行的解决方案
方案1:修改扩展方法,让调用者赋值返回值
调整你的扩展方法(简化写法),调用时把返回值赋值给目标变量即可:
namespace MyUtility { public static class Extension { public static Vector3 WithX(this Vector3 v, float x) { return new Vector3(x, v.y, v.z); } } }
调用方式:
transform.position = transform.position.WithX(newX);
方案2:直接写Transform的扩展方法(更贴合你的需求)
既然最终要修改的是transform.position,不如直接给Transform写扩展方法,跳过Vector3值传递的问题:
namespace MyUtility { public static class Extension { public static void SetPositionX(this Transform transform, float x) { Vector3 currentPos = transform.position; currentPos.x = x; transform.position = currentPos; } } }
调用方式完全符合你的预期:
transform.SetPositionX(newX);
内容的提问来源于stack exchange,提问作者MUSA ZENBİLCİ
相关产品推荐
相关产品推荐

