C# 通过自定义检查器编辑字符串列表无效

C# 通过自定义检查器编辑字符串列表无效,c#,unity3d,C#,Unity3d,我正在制作一个语音线+字幕系统,使用自定义检查器使其更易于使用。 在我尝试显示字幕EditorGUILayout.TextField之前,一切都很正常,就像我在语音音频剪辑中使用EditorGUILayout.ObjectField一样。 此功能有效(无字幕功能): showAudioClipList=EditorGUILayout.BeginFoldoutHeaderGroup(showAudioClipList,新GUI内容(“音频剪辑”,“与此对象交互时可播放的音频剪辑”); 如果(显示音

我正在制作一个语音线+字幕系统,使用自定义检查器使其更易于使用。 在我尝试显示字幕EditorGUILayout.TextField之前,一切都很正常,就像我在语音音频剪辑中使用EditorGUILayout.ObjectField一样。 此功能有效(无字幕功能):

showAudioClipList=EditorGUILayout.BeginFoldoutHeaderGroup(showAudioClipList,新GUI内容(“音频剪辑”,“与此对象交互时可播放的音频剪辑”);
如果(显示音频剪辑列表)
{
GUILayout.Beginterial(“盒子”);
对于(int i=0;i<\u AudioClips.arraySize;i++)
{
SerializedProperty AC_ref=_AudioClips.GetArrayElementIndex(i);
EditorGUILayout.BeginHorizontal(“框”);
AC_ref.objectReferenceValue=EditorGUILayout.ObjectField(“Clip”+(i+1)+“:”,AC_ref.objectReferenceValue,typeof(AudioClip),false);
if(GUILayout.Button(新GUIContent(“X”,“删除此剪辑”)、GUILayout.MaxWidth(20)))
t、 音频剪辑。删除(i);
EditorGUILayout.EndHorizontal();
}
EditorGUILayout.Space();
EditorGUILayout.BeginHorizontal();
if(GUILayout.Button(新内容(“添加剪辑”、“添加新剪辑条目”))
t、 音频剪辑。添加(空);
if(GUILayout.Button(新内容(“删除所有剪辑”、“删除所有剪辑条目”))
t、 音频剪辑。清除();
EditorGUILayout.EndHorizontal();
GUILayout.EndVertical();
}
EditorGUILayout.EndFoldoutHeaderGroup();
我想让它在每个音频剪辑框下面显示一个文本字段,这样我就可以为每个语音行写字幕。我让它为非列表字符串工作,但不能让它为列表字符串工作,就像音频剪辑列表工作一样

我试过了
t.Subtitles[i]=EditorGUILayout.TextField(等)
ST_ref.stringValue=EditorGUILayout.TextField(等)
试图复制音频剪辑的工作方式,以及其他一些工作方式,但都会在控制台中导致错误并使检查器崩溃

你能从这段代码中理解我的问题吗?

解决了它。 我正在使用

SerializedProperty SC_ref = _Subtitles.GetArrayElementAtIndex(i);
(以与音频剪辑相同的方式在
序列化属性AC_ref=\u AudioClips.getArrayElementIndex(i);
下),以及

EditorGUILayout.PropertyField(SC_ref);
(位于内部FOR循环的底部,在其自身的BeginOrizontal(“框”)中)以显示、设置和保存每个字符串值,因为每个字符串值都显示在其相应的AudioClip对象下。EditorGUILayout.PropertyField在inspector中显示变量的同时保存更改,因此它只需要短代码行即可工作。
\u Subtitles
是列表的序列化属性,通过使用
getArrayElementIndex()
我可以在列表中指定要修改的特定条目,方法是暂时将其保存为自己的SerializedProperty。

您确定要创建一个clip+description结构的列表吗?我知道odin很容易做到这一点,但肯定是这样works@BugFinder我想我知道怎么做,但是有没有更简单的方法将其添加到当前设置中,ra而不是像那样重做?可能,但我认为这将是一个很大的工作。添加
t.Subtitles[I]=EditorGUILayout.TextField(等…
会导致什么错误?@AleksandrStepanov编写
t.Subtitles[I]=EditorGUILayout.TextField(新内容(“Subtitle:”),t.Subtitles[I]);
给出错误
ArgumentOutOfRangeException:索引超出范围。必须为非负数且小于集合的大小。
并且它还会折叠检查器中的组件,使其完全不可用。
EditorGUILayout.PropertyField(SC_ref);