以下是整个班级:
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 //添加了完整的课程并重新制定了我的问题
答案 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()
{
}
}