我如何比较编辑器脚本中的两个列表,以便每次列表大小不同时只进行一次 for 循环?

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,一切都会变慢,几乎冻结。


胡说叔叔
浏览 85回答 2
2回答

慕娘9325324

您可以使用 BeginChangeCheck / EndChangeCheck 来检测修改。EditorGUI.BeginChangeCheck();_conversations.arraySize = EditorGUILayout.IntField("Conversations Size", _conversations.arraySize);if(EditorGUI.EndChangeCheck()) {&nbsp; &nbsp; &nbsp;for ...}页面预览page = EditorGUILayout.IntField("Page", page);int index = page * countPerPage;for(int x = index; i < Mathf.Min(_conversations.arraySize, index + countPerPage); ++i){&nbsp; &nbsp; ...}

FFIVE

您可以尝试仅将旧对话的数组大小保存为整数,而不保存第二个数组。但是有可能,这不会起作用,因为我认为必须在每次调用中执行 onInspectorGui 代码(但不确定)。
打开App,查看更多内容
随时随地看视频慕课网APP