Unity问询:如何用单函数让按钮修改100个布尔值中的任意一个?
Unity单函数批量修改布尔变量方案
需求背景
需要通过100个按钮分别将bool1至bool100设为true,但不想编写100个独立函数;同时要求按钮OnClick面板中显示变量选择输入框,而非默认的布尔复选框。
当前代码存在的问题:
- 原函数
ChangeBool(bool a)采用值传递,修改a只会改变局部变量,无法影响原布尔变量; - 值类型参数在
OnClick面板默认显示复选框,无法选择对象上的目标变量。
解决方案一:反射+字符串参数(快速实现)
直接修改脚本,通过反射根据变量名修改对应布尔值,同时让OnClick面板显示字符串输入框:
using UnityEngine; using System.Reflection; public class BoolController : MonoBehaviour { public bool bool1 = false; public bool bool2 = false; // ... 依次定义到bool100 public void SetBoolToTrue(string targetBoolName) { // 通过反射获取目标字段 FieldInfo targetField = GetType().GetField(targetBoolName, BindingFlags.Public | BindingFlags.Instance); if (targetField != null && targetField.FieldType == typeof(bool)) { targetField.SetValue(this, true); } } }
使用步骤:
- 将该脚本挂载到目标GameObject(如UI管理器对象);
- 给按钮绑定
OnClick事件,选择BoolController的SetBoolToTrue方法; - 在参数输入框中直接输入目标变量名(如
bool1、bool50)即可。
解决方案二:自定义编辑器扩展(可视化选择变量)
如果担心字符串输入出错,可以添加编辑器脚本,实现批量创建按钮并自动绑定事件(需将脚本放在Editor文件夹下):
using UnityEditor; using UnityEngine; using System.Reflection; [CustomEditor(typeof(BoolController))] public class BoolControllerEditor : Editor { public override void OnInspectorGUI() { base.OnInspectorGUI(); BoolController controller = (BoolController)target; FieldInfo[] boolFields = controller.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance); foreach (var field in boolFields) { if (field.FieldType == typeof(bool)) { if (GUILayout.Button($"快速创建[{field.Name}]按钮")) { GameObject newButton = new GameObject(field.Name); newButton.transform.SetParent(controller.transform); var button = newButton.AddComponent<UnityEngine.UI.Button>(); button.onClick.AddListener(() => controller.SetBoolToTrue(field.Name)); } } } } }
该方案适合批量创建按钮场景,无需手动输入变量名,直接在Inspector面板点击生成绑定好的按钮。
内容的提问来源于stack exchange,提问作者yang xu goh
相关产品推荐
相关产品推荐

