C# 如何使用自定义编辑器保存在预制模式(预制编辑视图,Unity 2018+;)下制作的预制修改?

C# 如何使用自定义编辑器保存在预制模式(预制编辑视图,Unity 2018+;)下制作的预制修改?,c#,unity3d,unity-editor,C#,Unity3d,Unity Editor,我有一个预置,上面有一个名为RoomInfo的单行为脚本。我正在使用一个自定义编辑器覆盖OnSceneGUI(),生成可单击的立方体,以更改房间的出口列表。当我打开预置进行编辑时,修改需要应用到预置资产,但我似乎找不到如何做 打开预制件时,这是预制件模式(自Unity 2018年起)。我尝试过使用prefactutility类中的方法,但是从((RoomInfo)目标)返回的GameObject。GameObject不属于任何类型的预制(?!?)请参见函数IsPartOfAnyPrefab(Ob

我有一个预置,上面有一个名为
RoomInfo
的单行为脚本。我正在使用一个自定义编辑器覆盖
OnSceneGUI()
,生成可单击的立方体,以更改房间的出口列表。当我打开预置进行编辑时,修改需要应用到预置资产,但我似乎找不到如何做

打开预制件时,这是预制件模式(自Unity 2018年起)。我尝试过使用
prefactutility
类中的方法,但是从
((RoomInfo)目标)返回的
GameObject
。GameObject
不属于任何类型的预制(?!?)请参见函数
IsPartOfAnyPrefab(Object componentOrGameObject)
。此外,问题在于保存预置资源,因为在游戏场景中编辑预置实例时,它可以工作

要检查的类:

public class RoomInfo : MonoBehaviour
{
    [SerializeField, Range(1, 10)]
    private int XTile = 1;

    [SerializeField, Range(1, 7)]
    private int YTile = 1;

    [SerializeField, HideInInspector]
    private List<Vector2Int> Exits_Up = new List<Vector2Int>();

    [SerializeField, HideInInspector]
    private List<Vector2Int> Exits_Down = new List<Vector2Int>();

    [SerializeField, HideInInspector]
    private List<Vector2Int> Exits_Right = new List<Vector2Int>();

    [SerializeField, HideInInspector]
    private List<Vector2Int> Exits_Left = new List<Vector2Int>();
}
public class RoomInfo:monobhavior
{
[序列化字段,范围(1,10)]
私有int XTile=1;
[序列化字段,范围(1,7)]
私有整数=1;
[序列化字段,隐藏索引]
私有列表退出_Up=new List();
[序列化字段,隐藏索引]
私有列表退出_Down=new List();
[序列化字段,隐藏索引]
私有列表退出_Right=new List();
[序列化字段,隐藏索引]
私有列表退出_Left=新列表();
}
编辑:

[CustomEditor(typeof(RoomInfo), true)]
public class RoomInspector : Editor
{
    private RoomInfo room = null;

    private SerializedProperty upExitsProperty;
    private SerializedProperty downExitsProperty;
    private SerializedProperty rightExitsProperty;
    private SerializedProperty leftExitsProperty;

    private void Awake()
    {
        room = target as RoomInfo;

        upExitsProperty = serializedObject.FindProperty("Exits_Up");
        downExitsProperty = serializedObject.FindProperty("Exits_Down");
        rightExitsProperty = serializedObject.FindProperty("Exits_Right");
        leftExitsProperty = serializedObject.FindProperty("Exits_Left");
    }

    public void OnSceneGUI()
    {
        serializedObject.Update();

        for (int i = 0; i < room.XTileNb; i++) // Down
        {
            Vector3 pos = new Vector3(i + 0.5f, -0.5f, -0.5f);
            Vector2Int coordinates = new Vector2Int(i, 0);

            int index = -1;
            bool contain = Contains(downExitsProperty, coordinates, ref index);

            if (contain)
                Handles.color = new Color(0.0f, 1.0f, 0.0f, 0.8f);
            else
                Handles.color = new Color(1.0f, 0.0f, 0.0f, 0.8f);

            if (Handles.Button(pos, Quaternion.identity, 1.0f, 1.0f, Handles.CubeHandleCap))
            {
                if (contain)
                    Remove(downExitsProperty, index);
                else
                    Add(downExitsProperty, coordinates);

                Repaint();
            }
        }

        // ...
        // Repeated 3 times for up, left and right of the room

        serializedObject.ApplyModifiedPropertiesWithoutUndo();
    }
[自定义编辑器(typeof(RoomInfo),true)]
公共教室检查员:编辑
{
private RoomInfo room=null;
私有财产;不动产;
私有财产downExitsProperty;
私有财产权退出财产;
私有序列化属性leftExitsProperty;
私人空间
{
房间=作为房间信息的目标;
upExitsProperty=serializedObject.FindProperty(“Exits_Up”);
downExitsProperty=serializedObject.FindProperty(“Exits_Down”);
rightExitsProperty=serializedObject.FindProperty(“Exits_Right”);
leftExitsProperty=serializedObject.FindProperty(“Exits_Left”);
}
公共无效OnSceneGUI()
{
serializedObject.Update();
对于(int i=0;i
方法
包含
删除
添加
只是帮助函数,用于将序列化属性作为列表进行操作


我希望能够将更改应用于预制资产,这样设计师就可以创建房间预制,而不是在游戏场景中进行更改。谢谢您的帮助!:)

我修复了它,当我能够看到解决问题的确切方法时,我会发布一个答案。我覆盖了
OnIspectorGUI()
不调用
base.OnInspectorGUI()
。我将方法
serializedObject.ApplyModifiedProperties Without undo()
更改为
serializedObject.ApplyModifiedProperties()
你不认为这是问题所在吗?你最终解决了吗?我正在努力解决类似的问题,有一个脚本来自动处理一些预制件的工作,但是InstancePrefab失败了..也尝试了ApplyModifiedProperties,但还没有成功