为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
胡说叔叔 2022-11-21 15:52:29
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)

{

    ...

}


查看完整回答
反对 回复 2022-11-21
?
FFIVE

TA贡献1797条经验 获得超6个赞

您可以尝试仅将旧对话的数组大小保存为整数,而不保存第二个数组。但是有可能,这不会起作用,因为我认为必须在每次调用中执行 onInspectorGui 代码(但不确定)。



查看完整回答
反对 回复 2022-11-21
  • 2 回答
  • 0 关注
  • 84 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信