Unity CustomEditor在Unity重启后删除列表参数

时间:2015-09-05 21:44:28

标签: c# unity3d

我正在使用自定义编辑器脚本来显示和调整可重新排序列表中元素的参数。但每当我重新启动Unity并单击持有脚本的GameObject时,这些参数将被重置(如帖子末尾的图片所示)。当我停用自定义编辑器脚本时,一切正常,因此问题可能在此脚本中。

这是使用自定义编辑器脚本的 Story 类:

[System.Serializable]
public class Story : MonoBehaviour
{
public List<Chapter> ChapterList;
}

和编辑器脚本,使用可重新排序列表:

[CustomEditor(typeof(Story))]
public class StoryEditor : Editor 
{
private Story story;
private ReorderableList reorderableList;

void OnEnable()
{
    story = (Story) target;
    if (story.ChapterList == null)
        story.ChapterList = new System.Collections.Generic.List<Chapter>();
    if (reorderableList == null)
        reorderableList = 
            new ReorderableList(
                story.ChapterList,
                typeof(Chapter), 
                true, true, true, true);

    reorderableList.drawElementCallback += DrawElement;
}

private void DrawElement(Rect rect, int index, bool active, bool focused)
{
    Chapter c = story.ChapterList[index];
    EditorGUI.BeginChangeCheck();
    c.ID = index+1;
    EditorGUI.IntField(new Rect(rect.x, rect.y, 20, rect.height-1), c.ID);
    c.Title = EditorGUI.TextField(new Rect(rect.x + 21, rect.y, rect.width - 79, rect.height-1), c.Title);
    c.Hide  = EditorGUI.Toggle(new Rect(rect.x + rect.width - 56, rect.y, 17, rect.height-1), c.Hide);

    if (GUI.Button(
        new Rect(
            rect.x + rect.width - 40, rect.y, 40, rect.height-1), "Edit"))
                Select(index);

    if (EditorGUI.EndChangeCheck())
    {
        EditorUtility.SetDirty(target);
    }
}

我搜索了问题,但我发现提到的解决方案使用 [System.Serializable] EditorUtility.SetDirty(target); ,我正在使用它们。我假设我在“DrawElement”方法中错过了一些东西,但我无法弄清楚它是什么。

Image displaying the changes pre and post restarting Unity

上半部分:重启前,下半部分:重启Unity后。

1 个答案:

答案 0 :(得分:1)

我在处理这个问题时遇到了一些问题。第一:每次重新选择包含Story脚本的对象时,编辑器OnEnable()方法中的if语句都是真的。这似乎是因为Editor Scripts的工作方式。我认为只要用户重新选择对象,它们就会被重新实例化。因此,我将new List<Chapter>();部分移动到Story类并实现了 Getter 功能。

private List<Chapter> chapterList;
public  List<Chapter> ChapterList
{
    get 
    { 
        if (chapterList == null)
            chapterList = new List<Chapter>();
        return chapterList;
    }
}

下一个问题是私有变量。虽然公共变量总是可序列化的,但私有值不会被序列化(尽管类被标记为[System.Serializable],我认为这可以解决这个问题)。要使私有变量Serializableable,必须将它们标记为[SerializeField]

[SerializeField]
private List<Chapter> chapterList;
public  List<Chapter> ChapterList
{
    get 
    { 
        if (chapterList == null)
            chapterList = new List<Chapter>();
        return chapterList;
    }
}

[SerializeField]添加到我的类中的每个私有变量后,问题就消失了。