Unity C#反射修改变量无报错但未生效的解决方法
反射修改变量不生效的解决方法
问题出在值类型的拷贝特性上:float是值类型,调用FieldInfo.GetValue()时会返回原变量的副本,你后续对Value的赋值只是修改了这个副本,完全没触碰到UpgradeValues实例里的原speed变量。
修正方法很简单,直接用FieldInfo.SetValue()方法给原变量赋值,而不是修改GetValue返回的副本:
public void OnMouseDown() { var Instance = ChosenObject.GetComponent<UpgradeValues>(); if (Instance == null) return; // 先确保实例获取成功 var field = typeof(UpgradeValues).GetField(VarName, BindingFlags.Public | BindingFlags.Instance); if (field == null) // 防止变量名拼写错误导致空引用 { Debug.LogError($"找不到名为{VarName}的字段"); return; } field.SetValue(Instance, 100f); // 直接给原实例的字段赋值 }
额外说明
- 对于引用类型(比如自定义类、数组),
GetValue返回的是对象引用,修改引用指向的内容会影响原实例,但值类型始终是拷贝,必须用SetValue才能修改原变量。 - 加上空值检查可以避免后续代码出现隐藏错误,方便调试。
内容的提问来源于stack exchange,提问作者ReoCyan
相关产品推荐
相关产品推荐

