using System.Collections;using System.Collections.Generic;using UnityEditor;using UnityEditorInternal;using UnityEngine;[CustomEditor(typeof(DialogueTrigger))]public class DialogueTriggerEditor : Editor{ private SerializedProperty _dialogues; private SerializedProperty _conversations; private SerializedProperty old_Conversations; private void OnEnable() { _conversations = serializedObject.FindProperty("conversations"); old_Conversations.arraySize = _conversations.arraySize; } public override void OnInspectorGUI() { //base.OnInspectorGUI(); serializedObject.Update(); _conversations.arraySize = EditorGUILayout.IntField("Conversations Size", _conversations.arraySize); if (old_Conversations.arraySize != _conversations.arraySize) { for (int x = 0; x < _conversations.arraySize; x++) { var conversation = _conversations.GetArrayElementAtIndex(x); var Id = conversation.FindPropertyRelative("conversationName"); EditorGUILayout.PropertyField(Id); }}OnInspectorGUI 中的所有内容都非常快速地一遍又一遍地调用。所以它不停地循环。我添加了 _conversations 的旧副本:private SerializedProperty old_Conversations;我第一次尝试将它分配给 OnEnable 中的原始 _conversations:old_Conversations.arraySize = _conversations.arraySize;但是我使用了一个断点并且 OnEnable 从未调用过。然后在循环之前我正在做检查:if (old_Conversations.arraySize != _conversations.arraySize)在底部,我再次使两者相等。但它不起作用。当更改 _conversations 的大小时,它总是将它改回 1 并且之后什么都不做。我的主要目标是以某种方式在每次大小更改时只调用一次循环。如果大小为 1、5 或 10,它工作正常,但如果我将大小更改为 100,一切都会变慢,几乎冻结。
2 回答
慕娘9325324
TA贡献1783条经验 获得超4个赞
您可以使用 BeginChangeCheck / EndChangeCheck 来检测修改。
EditorGUI.BeginChangeCheck();
_conversations.arraySize = EditorGUILayout.IntField("Conversations Size", _conversations.arraySize);
if(EditorGUI.EndChangeCheck()) {
for ...
}
页面预览
page = EditorGUILayout.IntField("Page", page);
int index = page * countPerPage;
for(int x = index; i < Mathf.Min(_conversations.arraySize, index + countPerPage); ++i)
{
...
}
FFIVE
TA贡献1797条经验 获得超6个赞
您可以尝试仅将旧对话的数组大小保存为整数,而不保存第二个数组。但是有可能,这不会起作用,因为我认为必须在每次调用中执行 onInspectorGui 代码(但不确定)。
- 2 回答
- 0 关注
- 84 浏览
添加回答
举报
0/150
提交
取消