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

如何在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:这两个方法分别负责从源组件读取字段值,再把值写入目标组件对应的字段,完美完成复制动作。

使用步骤

  1. 在场景中创建一个空GameObject,把这个ValueCopier脚本挂载上去。
  2. 在Inspector面板里,把两个挂载了Values脚本的GameObject上的Values组件,分别拖到sourceValues(源)和targetValues(目标)的引用框里。
  3. 触发CopyBooleanValues()方法就行——可以通过UI按钮点击、游戏内的特定事件,或者在Start()方法里自动执行。

额外提示

  • 反射的性能开销极小,对于这种简单的字段复制场景,完全不用担心性能问题。
  • 如果以后需要处理私有字段,只要在GetFields的参数里加上BindingFlags.NonPublic就行,但一般公共字段已经能满足你的需求了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:26:58