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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:29:59