如何查找所有包含同名布尔变量的C#脚本并批量修改对应变量值
实现方案
提供两种常用实现思路,可根据你的项目实际情况选择:
方案一:接口实现(推荐)
该方案类型安全、运行效率高,是工业级项目的首选方案。
- 首先定义公共接口,新建
ITriggerable.cs:
public interface ITriggerable { bool isTrigger { get; set; } }
- 给所有包含
isTrigger变量的脚本继承该接口,以Script1.cs为例:
public class Script1 : MonoBehaviour, ITriggerable { public bool isTrigger = false; // 原有其他代码保持不变 }
- 编写
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
相关产品推荐
相关产品推荐

