private void OnEnable()
{
_conversationTrigger = (ConversationTrigger)target;
_conversations = serializedObject.FindProperty("conversations");
conversationsList = new ReorderableList(serializedObject, _conversations)
{
displayAdd = true,
displayRemove = true,
draggable = true,
drawHeaderCallback = DrawConversationsHeader,
drawElementCallback = DrawConversationsElement,
onAddCallback = (list) =>
{
SerializedProperty addedElement;
// if something is selected add after that element otherwise on the end
if (_currentlySelectedConversationIndex >= 0)
{
list.serializedProperty.InsertArrayElementAtIndex(_currentlySelectedConversationIndex + 1);
addedElement = list.serializedProperty.GetArrayElementAtIndex(_currentlySelectedConversationIndex + 1);
}
else
{
list.serializedProperty.arraySize++;
addedElement = list.serializedProperty.GetArrayElementAtIndex(list.serializedProperty.arraySize - 1);
}
var name = addedElement.FindPropertyRelative("Name");
var foldout = addedElement.FindPropertyRelative("Foldout");
var dialogues = addedElement.FindPropertyRelative("Dialogues");
name.stringValue = "";
foldout.boolValue = false;
dialogues.arraySize = 0;
conversationsCounter = addedElement.FindPropertyRelative("ConversationIndex");
GUI.FocusControl("Load Conversations");
},
elementHeightCallback = (index) =>
{
return GetConversationHeight(_conversations.GetArrayElementAtIndex(index));
}
};
}
稍后,我在脚本中的OnInspectorGUI中有一个按钮:
if (GUILayout.Button("Load Conversations"))
{
Undo.RecordObject(_conversationTrigger, "Loaded conversations from JSON");
_conversationTrigger.LoadConversations();
}
但是它不起作用,我需要在编辑器中单击任何其他控件以使int字段中的更改值生效。
这里我正在使用IntField:
public override void OnInspectorGUI()
{
serializedObject.Update();
// if there are no elements reset _currentlySelectedConversationIndex
if (conversationsList.serializedProperty.arraySize - 1 < _currentlySelectedConversationIndex) _currentlySelectedConversationIndex = -1;
EditorGUILayout.LabelField("Conversations", EditorStyles.boldLabel);
EditorGUI.BeginChangeCheck();
{
newSize = EditorGUILayout.IntField(_conversations.arraySize);
}
if (EditorGUI.EndChangeCheck())
{
if (newSize > _conversations.arraySize)
{
// elements have to be added -> how many?
var toAdd = newSize - _conversations.arraySize - 1;
// why -1 ? -> We add the first element and set its values to default
// now if we simply increase the arraySize for the rest of the elements
// they will be all a copy of the first -> all defaults ;)
// first add one element
_conversations.arraySize++;
// then get that element
var newIndex = _conversations.arraySize - 1;
var newElement = _conversations.GetArrayElementAtIndex(newIndex);
// now reset all properties like
var name = newElement.FindPropertyRelative("Name");
name.stringValue = "";
// now for the rest simply increase arraySize
_conversations.arraySize += toAdd;
}
else
{
// for removing just make sure the arraySize is not under 0
_conversations.arraySize = Mathf.Max(newSize, 0);
}
}
scrollPos = EditorGUILayout.BeginScrollView(scrollPos, GUILayout.Height(250));
GUILayout.Space(10);
conversationsList.DoLayoutList();
EditorGUILayout.EndScrollView();
if (GUILayout.Button("Save Conversations"))
{
_conversationTrigger.SaveConversations();
}
if (GUILayout.Button("Load Conversations"))
{
Undo.RecordObject(_conversationTrigger, "Loaded conversations from JSON");
_conversationTrigger.LoadConversations();
}
serializedObject.ApplyModifiedProperties();
}
当我在IntField中输入新的大小值时,它会实时更改列表并添加/删除项目。
但是,如果我将IntField设置为0,然后单击“加载对话”按钮,它将加载项目,但是intfield中的值仍为0,而改为已加载的项目数。
仅当我在编辑器中单击另一个控件,甚至在PC中单击另一个窗口时,才将intfield值更改为已加载项目的编号值。
答案 0 :(得分:1)
您可以使用EditorGUI.FocusTextInControl
。
通常您会打电话
GUI.SetNextControlName("MyTextField");
为了在下一个显示的字段中设置一个特定的名称(如标签一样的名称),然后再进行一些事件调用
EditorGUI.FocusTextInControl("MyTextField");
以便将焦点设置到该字段。
在您的情况下,您只是想放宽焦点而不是专注于任何领域,您可以简单地使用
EditorGUI.FocusTextInControl(null);