Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在编辑器脚本中比较两个列表,以便每次列表大小不相同时只生成一次for循环?_C#_Unity3d - Fatal编程技术网

C# 如何在编辑器脚本中比较两个列表,以便每次列表大小不相同时只生成一次for循环?

C# 如何在编辑器脚本中比较两个列表,以便每次列表大小不相同时只生成一次for循环?,c#,unity3d,C#,Unity3d,我第一次尝试将其分配给OneTable中的原始对话: private SerializedProperty old_Conversations; 但我使用了一个断点,而“一体”从未调用过 然后在循环之前,我要进行检查: old_Conversations.arraySize = _conversations.arraySize; 在底部,我使两者再次相等 但它不起作用。当更改_对话的大小时,总是将其更改回1,之后不做任何操作 我的主要目标是每次大小改变时只调用一次循环。 如果大小为1、5或1

我第一次尝试将其分配给OneTable中的原始对话:

private SerializedProperty old_Conversations;
但我使用了一个断点,而“一体”从未调用过

然后在循环之前,我要进行检查:

old_Conversations.arraySize = _conversations.arraySize;
在底部,我使两者再次相等

但它不起作用。当更改_对话的大小时,总是将其更改回1,之后不做任何操作

我的主要目标是每次大小改变时只调用一次循环。
如果大小为1、5或10,效果很好,但是如果我将大小更改为100,所有内容都会变慢,几乎冻结。

您可以尝试将旧对话的数组大小保存为整数,而不保存第二个数组。但有一种可能性,这是行不通的,因为我认为每次调用都必须执行onInspectorGui代码(但对此并不确定)。

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

您可以使用BeginChangeCheck/EndChangeCheck来检测修改

if (old_Conversations.arraySize != _conversations.arraySize)

页面视图

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
您可以使用BeginChangeCheck/EndChangeCheck来检测修改

if (old_Conversations.arraySize != _conversations.arraySize)

页面视图

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
它不工作了。它没有显示任何EditorGUILayout字段。问题是,为了使EditorGUILayout正常工作,必须始终调用onInspectorGui,但另一方面,如果循环过多的项,则会使一切变得太慢。我的主要目标是每次大小更改时只调用一次循环,这就是你在问题中所说的,现在只有当大小改变时才调用循环。因此,如果你说这不起作用,那么这个问题就错了。在我看来,问题是你必须在每次调用onGUI或onInspectorGUI时调用EditorGUILayout方法,如果你想让它显示在编辑器中的话。因此,如果它有这么多的项目滞后,你必须作出一个变通办法。我的想法是使用某种分页。如果您不想显示数组中的每个元素(但其中的一部分),则不需要对所有元素进行for循环。而将(x=0;x)的
改为(x=index;x
,然后制作另一个
IntField
来更改索引值。或者像inspector中的普通数组一样使用
EditorGUI.Foldout
来切换可见性。@shingo我尝试在页面上使用第二个解决方案。这是我的代码。现在请在链接中查看它。我不确定我是否使用了rig我还没有测试它,因为我不确定它是否正确。它不工作。它没有显示任何EditorGUILayout字段。问题是,必须一直调用onInspectorGui才能使EditorGUILayout工作,但另一方面,如果循环过多的项,则会使所有内容都太复杂ow.我的主要目标是每次大小改变时只调用一次循环,这就是你在问题中所说的,现在只有大小改变时才会调用循环。因此,如果你说这不起作用,那么问题就错了。在我看来,问题是每次调用onGUI或onIns时都必须调用EditorGUILayout方法如果你想让它显示在编辑器中,你可以选择GUI。因此,如果它有太多的项目,你必须做一个变通方法。我的想法是使用某种分页。如果你不想显示数组中的每个元素(但其中的一部分),那么你就不需要对所有元素执行for循环。相反,
for(x=0;x<\u对话。排列;
与(x=index;x,然后制作另一个
IntField
来更改索引值。或者像inspector中的普通数组一样使用
EditorGUI.Foldout
来切换可见性。@shingo我尝试在页面上使用第二个解决方案。这是我的代码。现在请在链接中查看它。我不确定我是否使用了rig我还没有测试它,因为我不确定它是否正确。