如何在Unity中自动同步两个同脚本实例的所有布尔值?
自动遍历布尔值复制的实现方案
当然有办法啦!你可以借助C#的反射机制来实现这个需求——它能让你在运行时动态获取类的成员信息,这样以后给Values脚本新增布尔变量时,完全不用修改负责复制的代码,省心又省力。
具体实现代码
你可以写一个专门的复制工具脚本,比如这样:
using System.Reflection; using UnityEngine; public class ValueCopier : MonoBehaviour { // 在Inspector里指定源和目标的Values组件 public Values sourceValues; public Values targetValues; // 调用这个方法就能完成布尔值复制 public void CopyBooleanValues() { if (sourceValues == null || targetValues == null) { Debug.LogError("源或目标的Values组件没指定哦!"); return; } // 获取Values类中所有的公共实例字段 FieldInfo[] allFields = typeof(Values).GetFields(BindingFlags.Public | BindingFlags.Instance); foreach (FieldInfo field in allFields) { // 只处理布尔类型的字段 if (field.FieldType == typeof(bool)) { // 从源组件读取值,再赋值给目标组件 bool currentValue = (bool)field.GetValue(sourceValues); field.SetValue(targetValues, currentValue); } } Debug.Log("布尔值复制完成!"); } }
关键逻辑解释
typeof(Values).GetFields(...):这行代码会自动扫描Values类的所有公共实例字段,不管你以后新增多少布尔变量,它都能自动识别到。- 循环里的类型判断:确保我们只复制布尔类型的字段,就算以后给
Values加了int、string这类其他类型的变量,也不会被误复制。 GetValue和SetValue:这两个方法分别负责从源组件读取字段值,再把值写入目标组件对应的字段,完美完成复制动作。
使用步骤
- 在场景中创建一个空GameObject,把这个
ValueCopier脚本挂载上去。 - 在Inspector面板里,把两个挂载了
Values脚本的GameObject上的Values组件,分别拖到sourceValues(源)和targetValues(目标)的引用框里。 - 触发
CopyBooleanValues()方法就行——可以通过UI按钮点击、游戏内的特定事件,或者在Start()方法里自动执行。
额外提示
- 反射的性能开销极小,对于这种简单的字段复制场景,完全不用担心性能问题。
- 如果以后需要处理私有字段,只要在
GetFields的参数里加上BindingFlags.NonPublic就行,但一般公共字段已经能满足你的需求了。
内容的提问来源于stack exchange,提问作者Nebulont
相关产品推荐
相关产品推荐

