Как я могу использовать кнопку графического интерфейса, чтобы включить отключить код в методе, а также изменить текст кнопки? - PullRequest
1 голос
/ 06 октября 2019
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using UnityEditor;
using UnityEngine;

public class CompareObjects : EditorWindow
{
    [MenuItem("Tools/Hierarchy Editor")]
    public static void ShowWindow()
    {
        GetWindow<CompareObjects>("CompareObjects");
    }
    private void OnGUI()
    {
        CustomHierarchy.gameObjectFontColor = EditorGUILayout.ColorField("Original Font Color", CustomHierarchy.gameObjectFontColor);
        CustomHierarchy.prefabOrgFontColor = EditorGUILayout.ColorField("Prefab Original Font Color", CustomHierarchy.prefabOrgFontColor);
        CustomHierarchy.prefabModFontColor = EditorGUILayout.ColorField("Prefab Modified Font Color", CustomHierarchy.prefabModFontColor);
        CustomHierarchy.inActiveColor = EditorGUILayout.ColorField("Inactive Color", CustomHierarchy.inActiveColor);

        if(GUILayout.Button("onoff"))
        {
            CustomHierarchy.onoff = !CustomHierarchy.onoff;
        }
    }
}

И пользовательская иерархия

using System.Linq;
using UnityEditor;
using UnityEngine;
//Adapted from Unity3DCollege YouTube Video Tutorial https://www.youtube.com/watch?v=pdDrY8Mc2lU
[InitializeOnLoad]
public class CustomHierarchy : MonoBehaviour
{
    private static Vector2 offset = new Vector2(0, 2);
    public static Color gameObjectFontColor = Color.black;
    public static Color prefabOrgFontColor = Color.black;
    public static Color prefabModFontColor = Color.white;
    public static Color inActiveColor = new Color(0.01f, 0.4f, 0.25f);
    public static Color containsBoxColliderColor = Color.yellow;
    public static bool onoff;

    static CustomHierarchy()
    {
        if (onoff == true)
        {
            EditorApplication.hierarchyWindowItemOnGUI += HandleHierarchyWindowItemOnGUI;
        }
    }

    private static void HandleHierarchyWindowItemOnGUI(int instanceID, Rect selectionRect)
    {
        Color fontColor = gameObjectFontColor;
        Color backgroundColor = new Color(.76f, .76f, .76f);
        FontStyle styleFont = FontStyle.Normal;
        var obj = EditorUtility.InstanceIDToObject(instanceID);
        GameObject gameObj = EditorUtility.InstanceIDToObject(instanceID) as GameObject;
        if (Selection.instanceIDs.Contains(instanceID))
        {
            backgroundColor = new Color(0.24f, 0.48f, 0.90f);
        }
        if (obj != null)
        {
            var prefabType = PrefabUtility.GetPrefabType(obj);
            if (gameObj.activeInHierarchy == false)
            {
                backgroundColor = inActiveColor;
            }

            if (gameObj.GetComponent<BoxCollider>() != null)
            {
                backgroundColor = containsBoxColliderColor;
            }

                if (prefabType == PrefabType.PrefabInstance)
            {
                styleFont = FontStyle.Bold;
                PropertyModification[] prefabMods = PrefabUtility.GetPropertyModifications(obj);
                foreach (PropertyModification prefabMod in prefabMods)
                {
                    if (prefabMod.propertyPath.ToString() != "m_Name" && prefabMod.propertyPath.ToString() != "m_LocalPosition.x" && prefabMod.propertyPath.ToString() != "m_LocalPosition.y" && prefabMod.propertyPath.ToString() != "m_LocalPosition.z" && prefabMod.propertyPath.ToString() != "m_LocalRotation.x" && prefabMod.propertyPath.ToString() != "m_LocalRotation.y" && prefabMod.propertyPath.ToString() != "m_LocalRotation.z" && prefabMod.propertyPath.ToString() != "m_LocalRotation.w" && prefabMod.propertyPath.ToString() != "m_RootOrder" && prefabMod.propertyPath.ToString() != "m_IsActive")
                    {
                        fontColor = prefabModFontColor;
                        break;
                    }
                }
                if (fontColor != prefabModFontColor) fontColor = prefabOrgFontColor;
            }
            Rect offsetRect = new Rect(selectionRect.position + offset, selectionRect.size);
            EditorGUI.DrawRect(selectionRect, backgroundColor);
            EditorGUI.LabelField(offsetRect, obj.name, new GUIStyle()
            {
                normal = new GUIStyleState() { textColor = fontColor },
                fontStyle = styleFont
            }
            );
        }
    }
}

Я хочу использовать кнопку в скрипте CompareObjects для отмены, если использовать или нет строку в скрипте CustopmHierarchy в этой части:

static CustomHierarchy()
    {
        if (onoff == true)
        {
            EditorApplication.hierarchyWindowItemOnGUI += HandleHierarchyWindowItemOnGUI;
        }
    }

Но нажатие кнопки ничего не делает.

1 Ответ

0 голосов
/ 06 октября 2019

Следующий код (в CustomHierarchy()) вызывается только один раз (после инициализации пользовательской иерархии):

    if (onoff == true)
    {
        EditorApplication.hierarchyWindowItemOnGUI += HandleHierarchyWindowItemOnGUI;
    }

По существу EditorApplication.hierarchyWindowItemOnGUI - это обработчик события, и когда вы добавляете функцию, выэффективно сообщать приложению, что оно запускается HandleHierarchyWindowItemOnGUI() при каждом запуске события. Вы делаете это только один раз , поэтому попытка проверить, является ли onoff true, ничего не сделает, потому что функция (HandleHierarchyWindowItemOnGUI()) уже присоединена к обработчику событий.

Вместопоместите оператор if (onoff) в фактическую функцию HandleHierarchyWindowItemOnGUI():

private static void HandleHierarchyWindowItemOnGUI(int instanceID, Rect selectionRect)
{
    if(onoff){
        ... //Do the stuff you had in this function
    }
}

Следовательно, он фактически не будет использовать код, который вы хотите выполнить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...