【问题标题】:How to hide variables depending on other variables values In Unity inspector如何在 Unity 检查器中根据其他变量值隐藏变量
【发布时间】:2022-01-07 14:47:17
【问题描述】:

如何根据统一检查器中的其他变量值隐藏变量。基本上想象一下:如果我有一个名为“CanSprint”的布尔值和一个浮点数“SprintSpeed”,那么我想使它在布尔值为真时显示浮点数,但当布尔值为假时,浮点数隐藏。这只是为了更整洁一点。 谢谢!

【问题讨论】:

标签: c# unity3d inspector


【解决方案1】:

您需要查看自定义编辑器脚本 (https://docs.unity3d.com/Manual/editor-CustomEditors.html),使用自定义编辑器脚本可以随时显示变量。这是使用链接信息的布局:

[CustomEditor(typeof(MyBehaviourClass))]
public class MyEditorClass : Editor
{
    public override void OnInspectorGUI()
    {
        // If we call base the default inspector will get drawn too.
        // Remove this line if you don't want that to happen.
        base.OnInspectorGUI();

        MyBehaviourClass myBehaviour = target as MyBehaviourClass;

        target.myBool = EditorGUILayout.Toggle("myBool", target.myBool);

        if (target.myBool)
        {
            target.someFloat = EditorGUILayout.FloatField ("Some Float:", target.someFloat);

        }
    }
}

请务必将此脚本粘贴在“Editor”文件夹中,将“MyBehaviourClass”更改为您的类类型,将“someFloat”更改为您的浮点数,将“myBool”更改为您的布尔变量。

【讨论】:

  • 谢谢,但我有一个小问题,如何使用自定义变量执行此操作,甚至可能吗?再次感谢!
  • 自定义变量是指您自己的浮点数和布尔值,还是您创建的实际自定义数据类型?
  • 如果您的意思是您自己的 float 和 bool 而不是您自己的自定义数据类型,您将所有出现的“MyBehaviourClass”(包括类定义上方的那个)更改为您的类类型(即保存你的浮点数和布尔值),然后将'target.mybool'更改为'target.*your bool here*',浮点数也是如此。
  • 我的意思是像这样一个带有浮点数、布尔值和字符串的公共类,但是如果有一组对象,而不仅仅是一个对象,我该怎么做呢?
  • 如果您的意思是“QuizQuizOption”将多次出现,编辑器脚本会将其更改应用到所有出现的地方。还是我误会了?此链接中有一个脚本,它添加了对多个变量的支持,如果这就是您的意思,可以同时打开和关闭:reddit.com/r/Unity3D/comments/3xc5yo/…
【解决方案2】:

使用 SetBools 方法和 HideIf(bool name, bool value, object to hide)

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

public class ExampleClass : MonoBehaviour
{
    public bool exampleBoolA = true;
    public float varToHideA;
    public bool exampleBoolB = false;
    public float varToHideB;
}

[CustomEditor(typeof(ExampleClass)), CanEditMultipleObjects]
public class ExampleEditor : Editor
{
    private List<boolStruct> structList;
    public void OnEnable()
    {
        structList = new List<boolStruct>();
        SetBools();
    }
    private void SetBools()
    {
        HideIf("exampleBoolA", false, "varToHideA");
        HideIf("exampleBoolB", true, "varToHideB");
    }
    private void HideIf(string boolName, bool boolValue, string fieldName)
    {
        boolStruct _boolStruct = new boolStruct()
        {
            targetBoolName = boolName,
            targetBoolValue = boolValue,
            targetVarName = fieldName,
        };
        structList.Add(_boolStruct);
    }
    public override void OnInspectorGUI()
    {
        serializedObject.Update();
        var obj = serializedObject.GetIterator();
        if (obj.NextVisible(true))
        {
            do
            {
                bool visible = true;
                foreach (var i in structList)
                {
                    if (i.targetVarName == obj.name)
                    {
                        FieldInfo boolName = target.GetType().GetField(i.targetBoolName);
                        var boolValue = boolName.GetValue(target);
                        if (boolValue.ToString() != i.targetBoolValue.ToString())
                            visible = false;
                        else
                        {
                            visible = true;
                            break;
                        }
                    }
                }
                if (visible)
                    EditorGUILayout.PropertyField(obj, true);
            } 
            while (obj.NextVisible(false));
        }
        serializedObject.ApplyModifiedProperties();
    }
    private struct boolStruct
    {
        public string targetBoolName {get;set;}
        public bool targetBoolValue {get;set;}
        public string targetVarName {get;set;}
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-15
    • 2022-10-14
    • 1970-01-01
    • 1970-01-01
    • 2019-01-29
    相关资源
    最近更新 更多