【问题标题】:Unity3d GUI.Button text change within hierarchyWindowItemOnGUIUnity3d GUI.Button文本在hierarchyWindowItemOnGUI中发生变化
【发布时间】:2017-08-08 15:49:14
【问题描述】:

这是整个班级:

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// 添加完整的课程并重新制定我的问题

【问题讨论】:

  • 到底是什么问题?什么不工作?
  • gui.button 文本没有改变,它只是保持打开状态,但游戏对象 dis/ 和重新激活工作
  • 发布更多代码。如果可能,添加整个班级。
  • 添加了完整的课程

标签: c# user-interface unity3d hierarchy


【解决方案1】:

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

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

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


编辑

这很棘手,因为HierarchyPlus 必须是一个静态函数。一个解决方案是使用字典。使用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()
    {

    }
}

【讨论】:

  • thx 解决了它,我应该自己看到它,但是这是否会更改每个层次结构项目的每个 gui.button 的文本,而不仅仅是单击的那个。
  • 但是 HierarchyPlus() 函数必须是静态的,否则它似乎不起作用,如果该函数是静态的 HierarchyItemCB 也必须是静态的,或者不是?
  • 它不工作,如果你能在你的电脑上测试它适合你的时间表,那就太好了:D
  • 我想在每个层次结构项目上绘制按钮并通过单击此按钮停用相应的游戏对象(whick 有效)我只需要更改单击按钮的文本即可工作。
  • 非常感谢,我知道为什么它不起作用 b4,我创建了一个新脚本,现在它再次起作用了,感谢您抽出时间:D
猜你喜欢
  • 2014-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-07
  • 1970-01-01
  • 1970-01-01
  • 2022-07-29
相关资源
最近更新 更多