Unity中如何在其他脚本访问某类变量?代码实现求助
问题分析与修复方案
嘿,我一眼就发现你代码里的关键问题啦!你用反射修改属性值的时候,给SetValue传了null作为第一个参数,但spawnP是Spawn类的实例对象,反射需要知道要修改哪个具体对象的属性,所以这里必须传入spawnP本身才行。
另外,为了让代码更健壮,我们还可以加一些额外的判断,比如空引用检查、只处理bool类型的属性,避免误改其他类型的属性。下面是修正后的完整代码:
private void TurnOff() { // 获取GameController组件中的spawn实例 var spawnP = gameController.GetComponent<GameController>().spawn; // 先检查实例是否为空,避免空引用异常 if (spawnP == null) { Debug.LogWarning("spawn实例为空,无法修改属性值"); return; } var type = spawnP.GetType(); // 明确指定绑定标志,只获取当前实例的公共属性 var properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance); foreach (var prop in properties) { // 只处理bool类型的属性,防止误操作其他类型属性 if (prop.PropertyType == typeof(bool)) { // 第一个参数传入要修改的实例对象spawnP prop.SetValue(spawnP, false); } } }
关键修复点说明:
SetValue的第一个参数:之前传null是修改静态属性的用法,而我们要修改的是spawnP这个实例的属性,所以必须传入spawnP。- 绑定标志过滤:添加
BindingFlags.Public | BindingFlags.Instance可以确保我们只拿到当前实例的公共属性,不会获取到静态属性或者私有属性。 - 空判断与类型检查:提前检查
spawnP是否为空,以及属性是否为bool类型,能有效避免运行时异常,让代码更稳定。
内容的提问来源于stack exchange,提问作者CodeSharpMarvin
相关产品推荐
相关产品推荐

