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

如何查找所有包含同名布尔变量的C#脚本并批量修改对应变量值

实现方案

提供两种常用实现思路,可根据你的项目实际情况选择:

方案一:接口实现(推荐)

该方案类型安全、运行效率高,是工业级项目的首选方案。

  1. 首先定义公共接口,新建ITriggerable.cs:
public interface ITriggerable
{
    bool isTrigger { get; set; }
}
  1. 给所有包含isTrigger变量的脚本继承该接口,以Script1.cs为例:
public class Script1 : MonoBehaviour, ITriggerable
{
    public bool isTrigger = false;
    // 原有其他代码保持不变
}
  1. 编写MasterScript.cs逻辑:
using UnityEngine;
using System.Collections.Generic;

public class MasterScript : MonoBehaviour
{
    private List<ITriggerable> allScripts = new List<ITriggerable>();

    void Start()
    {
        // 查找场景中所有符合要求的脚本,传true可包含未激活物体上的脚本
        MonoBehaviour[] allMonoBehaviours = FindObjectsOfType<MonoBehaviour>(true);
        foreach (var behaviour in allMonoBehaviours)
        {
            if (behaviour is ITriggerable triggerScript)
            {
                allScripts.Add(triggerScript);
            }
        }

        // 批量修改值
        for(int i = 0; i < allScripts.Count; i++)
        {
            allScripts[i].isTrigger = true;
        }
    }
}

该方案优势:

  • 无额外性能开销,运行效率高
  • 编译期即可检查类型错误,不会出现运行时变量找不到的问题
  • 后续扩展方便,新增公共逻辑只需在接口中定义即可

方案二:反射实现(无需修改原有脚本)

如果不想改动已有脚本的代码,可以用反射动态查找目标变量,适合小型项目或者临时需求场景。
MasterScript.cs代码如下:

using UnityEngine;
using System.Collections.Generic;
using System.Reflection;

public class MasterScript : MonoBehaviour
{
    private List<MonoBehaviour> allScripts = new List<MonoBehaviour>();
    // 缓存字段信息,避免重复反射查询提升性能
    private Dictionary<MonoBehaviour, FieldInfo> triggerFieldCache = new Dictionary<MonoBehaviour, FieldInfo>();

    void Start()
    {
        // 查找场景中所有Mono脚本,传true可包含未激活物体上的脚本
        MonoBehaviour[] allMonoBehaviours = FindObjectsOfType<MonoBehaviour>(true);
        foreach (var behaviour in allMonoBehaviours)
        {
            // 查找public实例字段isTrigger,且类型为bool
            FieldInfo field = behaviour.GetType().GetField("isTrigger", BindingFlags.Instance | BindingFlags.Public);
            if (field != null && field.FieldType == typeof(bool))
            {
                allScripts.Add(behaviour);
                triggerFieldCache.Add(behaviour, field);
            }
        }

        // 批量修改值
        for(int i = 0; i < allScripts.Count; i++)
        {
            var targetScript = allScripts[i];
            triggerFieldCache[targetScript].SetValue(targetScript, true);
        }
    }
}

该方案注意事项:

  • 反射有一定性能开销,上面代码已经做了字段缓存优化,避免重复查询
  • 变量名拼写错误不会在编译期报错,只有运行时才会触发问题,调试成本更高

内容的提问来源于stack exchange,提问作者Vika

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 08:36:04