可编写脚本的对象在重命名时重新排序父/子

问题描述

我是如何到达这里的:我一直在开发一种使用具有子脚本对象的脚本对象的工具。该系统运行良好,但是当我重命名 SO 时,Unity 中的父/子关系会中断。

我现在设法将其归结为一个非常简单的案例研究。

使用下面的代码,您可以创建一个容器 SO 资产。然后使用 MyMenu 创建数据,它是容器的子项。所有这些都按预期进行,项目中的关系是:

容器 -> 数据

但是,一旦您将容器 SO 重命名为其他名称,Unity 会对父子项重新排序,以便数据现在是父项,而容器是子项:

数据 -> 容器

以下是应该重复此问题的代码(Unity 2020.1.17f1 - 在 2020.1.8 上也有相同的结果)

Container.cs

using UnityEngine;

[CreateAssetMenu]
public class Container : ScriptableObject
{
}

Data.cs

using UnityEngine;

public class Data : ScriptableObject
{
}

CustomEditor.cs

using UnityEditor;
using UnityEngine;

public class CustomEditor : Editor
{
    [MenuItem("MyMenu/Create Data for Container")]
    static void CreateDataForContainer()
    {
        Container container = Selection.activeObject as Container;
        if (container != null)
        {
            Data data = ScriptableObject.CreateInstance(typeof(Data)) as Data;
            data.name = data.GetType().Name;
            if (!string.IsNullOrEmpty(AssetDatabase.GetAssetPath(container)))
            {
                AssetDatabase.AddobjectToAsset(data,container);
            }
            AssetDatabase.SaveAssets();
        }
    }
}

注意事项

  • 起初我以为这是命名空间的问题,但事实并非如此
  • 认为这可能是程序集问题,但现在基本类的情况并非如此
  • 关闭/打开项目结果相同
  • 重命名后资产文件相同

如果您遇到过这种情况,我很想知道我在这里做错了什么,我的工具快完成了,这阻止我推出它。谢谢!

解决方法

Unity 端的错误修复:

Unity Bug