c# - 如何在 Inspector 中设置 GUI.Button 的位置?
问题描述
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEditorInternal;
using UnityEngine;
[CustomEditor(typeof(ConversationTrigger))]
public class ConversationTriggerEditor : Editor
{
private ConversationTrigger conversationtrigger;
private void OnEnable()
{
conversationtrigger = FindObjectOfType<ConversationTrigger>();
}
public override void OnInspectorGUI()
{
DrawDefaultInspector();
if(GUI.Button(new Rect(0.1f,0.5f,0.1f,0.1f), "Add new item"))
{
conversationtrigger.conversations.Add(new Conversation());
}
if (GUILayout.Button("Save Conversations"))
{
conversationtrigger.SaveConversations();
}
if (GUILayout.Button("Load Conversations"))
{
Undo.RecordObject(conversationtrigger, "Loaded conversations from JSON");
conversationtrigger.LoadConversations();
}
}
}
我试过这条线:
if(GUI.Button(new Rect(0.1f,0.5f,0.1f,0.1f), "Add new item"))
但这会使按钮像删除一样消失。如果我正在使用GUILayout.Button
,我会看到按钮,但我无法设置按钮位置,所以我正在使用GUI.Button
.
我想将按钮放置"Add new item"
在字段之前,Canvas
并且始终位于最后一个对话项目之后,在本例中为 Locked Room。如果我要添加一个新项目,该按钮应该保留在新添加的项目之后和Canvas
字段之前。
我猜这个值Rect
是错误的,使按钮位于窗口外。
这是 Inspector 的屏幕截图:
解决方案
的值为Rect
、positionX
和,positionY
Inspector的值以像素为单位。所以width
height
new Rect(0.1f,0.5f,0.1f,0.1f)
只是在当前检查器的位置像素上产生一个非常小的0.1 x 0.1
像素大小按钮。0.1 ,0.5
由于您无法0.1
在屏幕上显示大小像素的东西,因此它是不可见的。
您可以使用 AfaikGUILayoutUtility.GetLastRect
来获取Rect
按钮之前的最后一个控件,然后使用该矩形放置按钮,例如
Rect lastRect = GUILayoutUtility.GetLastRect();
Rect buttonRect = new Rect(lastRect.x, lastRect.y + EditorGUIUtility.singleLineHeight, 100, 30);
if(GUI.Button(buttonRect, "AddNewItem")
...
将按钮 I 放在最后一个控件下的下一行并将其大小设置为100px * 30px
.
GUI
但是,我通常建议不要混合使用GUILayout
。这有点像混合static
和relative
..css
根据您要在此处更改的确切内容,您可能更愿意使用可选options
参数来更改按钮的高度和宽度,例如
GUILayout.Button("AddNewItem", GUILayout.With(100), GUILayout.Height(30));
您也可以通过临时更改EditorGUI.indentLevel来更改按钮从 X 轴开始的位置,例如
EditorGUI.indentLevel++
GUILayout.Button("AddNewItem", GUILayout.With(100), GUILayout.Height(30));
EditorGUI.indentLevel--;
要更改 Y 方向的位置,您可以使用EditorGUILayout.Space
EditorGUILayout.Space();
if(GUILayout.Button(...))
为了在按钮和控件之前或之前有一个小的默认空间,GUILayout.Space
例如
GUILayout.Space(30);
if(GUILayout.Button(...))
以像素为单位设置固定空间。
对于您的实际问题
如果您真的想在控件之间放置一个按钮,然后您不会为整个检查器实现编辑器而不是使用,DrawDefaultInspector
因为这也意味着您必须为按钮腾出空间。否则,您可能会在彼此之上获得多个控件。
我不会在这里为你这样做。我们甚至看不到您的课程的字段/类型。
但是由于您在那里使用列表/数组,所以我(就像我经常做的那样)再次强烈建议使用未记录的ReorderableList
,这不仅非常精美,并且允许您通过拖放重新排列列表中的项目,而且还可以实现Add
和Remove
按钮默认。
我也可以问你为什么这样做
conversationtrigger = FindObjectOfType<ConversationTrigger>();
一旦您处理不活动的 GameObject、disabled ConversationTrigger
、Prefab 或场景中的多个这些组件,这将失败。
在编辑器中,您已经在target
. 你所要做的就是把它像
conversationtrigger = (ConversationTrigger) target;
注意:在智能手机上打字,所以没有保修,但我希望这个想法很清楚
推荐阅读
- javascript - 如何修复 Vuejs 中的“webpack Dev Server Invalid Options”
- python - SpeechRecognition 不工作(未检测到麦克风)
- python - 自定义 python 生成器中的 Return 和 StopIteration
- javascript - 使用 reduce 和 react hooks 的更好方法
- php - 如何在 PHP 5.6 版本中使用全局常量而不是类常量
- r - 如何将数据框中的所有 0 替换为诸如“。”之类的字符。或者 ”-”?
- c# - 带有 WPF managedhost 控件的 AX 表单无法再次打开
- sql - 创建 SQL 总计表
- lua - 我有 Luadec 的问题,错误:预编译块中的错误标头
- javascript - append() 是 jQuery 还是 Javascript 函数?