首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Unity检查器中隐藏依赖于其他变量值的变量

如何在Unity检查器中隐藏依赖于其他变量值的变量
EN

Stack Overflow用户
提问于 2017-11-22 17:16:54
回答 2查看 9.1K关注 0票数 0

如何在unity检查器中隐藏依赖于其他变量值的变量。基本上想象一下:如果我有一个名为"CanSprint“的布尔值和一个浮点数"SprintSpeed”,所以我想让它成为这样,当布尔值为真时,浮点数就会显示出来,但当布尔值为假时,浮点数就会隐藏。这只是为了更整洁一点。谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-22 17:30:04

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

代码语言:javascript
复制
[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);

        }
    }
}

确保将此脚本放在“编辑器”文件夹中,将“MyBehaviourClass”更改为您的类类型,将“someFloat”更改为浮点型,将“myBool”更改为布尔变量。

票数 3
EN

Stack Overflow用户

发布于 2022-01-07 06:47:17

对HideIf(布尔名、布尔值、要隐藏的对象)使用SetBools方法

代码语言:javascript
复制
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;}
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47430785

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档