Unity3d GUI.Button文本在hierarchyWindowItemOnGUI中更改

时间:2017-08-08 15:49:14

标签: c# user-interface unity3d hierarchy

以下是整个班级:

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

[InitializeOnLoad]
public class HierarchyPlus{

    static HierarchyPlus()
    {
        EditorApplication.hierarchyWindowItemOnGUI += HierarchyItemCB;
    }

    private static void HierarchyItemCB(int instanceID, Rect selectionRect)
    {
        GameObject go = (GameObject)EditorUtility.InstanceIDToObject(instanceID);
        Rect rect = new Rect(selectionRect);
        rect.x = rect.width - 30;
        string btnStr = "On";
        if (go != null)
        {
            GUI.skin.button.fixedWidth = 30;

            if (GUI.Button(rect, btnStr))
            {
                Debug.Log(go.name);
                if (go.activeSelf == true)
                {
                    go.SetActive(false);
                    btnStr = "Off";
                }
                else
                {
                    go.SetActive(true);
                    btnStr = "On";
                }
            }
        }               
    }    

    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {

    }
}

我想更改我在层次结构项上绘制的GUI.Button文本。 GameObjects的激活和停用仅适用于Button文本没有改变,它保持为“On”。

编辑1 //添加了完整的课程并重新制定了我的问题

1 个答案:

答案 0 :(得分:1)

查看string btnStr = "On";函数中的HierarchyItemCB

每次调用btnStr函数时,"On"变量都会重新初始化为HierarchyItemCB

btnStr函数之外声明并初始化HierarchyItemCB变量。同时将其标记为static,以便您可以在HierarchyItemCB函数中访问它也是static函数。

修改

这很棘手,因为HierarchyPlus 必须是一个静态函数。解决方案是使用Dictionary。使用instanceID作为键,使用按钮string作为值。

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

[InitializeOnLoad]
public class HierarchyPlus
{

    static HierarchyPlus()
    {
        EditorApplication.hierarchyWindowItemOnGUI += HierarchyItemCB;
    }

    static Dictionary<int, string> instanceToBtnStr = new Dictionary<int, string>();

    private static void HierarchyItemCB(int instanceID, Rect selectionRect)
    {
        Debug.Log("Over");


        GameObject go = (GameObject)EditorUtility.InstanceIDToObject(instanceID);
        Rect rect = new Rect(selectionRect);
        rect.x = rect.width - 30;


        if (go != null)
        {
            //Add key if it is not in the Dictionary yet
            if (!instanceToBtnStr.ContainsKey(instanceID))
            {
                //Add with Default On Key
                instanceToBtnStr.Add(instanceID, go.activeSelf ? "On" : "Off");
            }

            GUI.skin.button.fixedWidth = 30;

            //Initialize btnStr from Dictionary
            string btnStr = instanceToBtnStr[instanceID];

            if (GUI.Button(rect, btnStr))
            {
                Debug.Log(go.name);
                if (go.activeSelf == true)
                {
                    go.SetActive(false);
                    instanceToBtnStr[instanceID] = "Off";
                }
                else
                {
                    go.SetActive(true);
                    instanceToBtnStr[instanceID] = "On";
                }
            }
        }
    }

    // Use this for initialization
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {

    }
}