Example #1
0
    static void LoadAsset()
    {
        if (Application.isPlaying)
        {
            if (!s_instance)
            {
                s_instance = Resources.Load(typeof(T).Name) as T;
            }
        }

        #if UNITY_EDITOR
        if (!s_instance)
        {
            ResourceSingletonBuilder.BuildResourceSingletonsIfDirty(); // ensure that singletons were built

            var temp       = ScriptableObject.CreateInstance <T>();
            var monoscript = MonoScript.FromScriptableObject(temp);
            ScriptableObject.DestroyImmediate(temp);
            var scriptPath = AssetDatabase.GetAssetPath(monoscript);
            var assetDir   = Path.GetDirectoryName(scriptPath) + "/Resources/";
            var assetPath  = assetDir + Path.GetFileNameWithoutExtension(scriptPath) + ".asset";
            s_instance = AssetDatabase.LoadAssetAtPath <T>(assetPath);
        }
        #endif
    }
    static void LoadAsset()
    {
        if (Application.isPlaying)
        {
            if (!s_instance)
            {
                s_instance = Resources.Load(ResourceFilenameAttribute.Get <T>()) as T;
            }
        }

        #if UNITY_EDITOR
        if (!s_instance)
        {
            ResourceSingletonBuilder.BuildResourceSingletonsIfDirty(); // ensure that singletons were built

            var temp       = CreateInstance <T>();
            var monoscript = MonoScript.FromScriptableObject(temp);
            DestroyImmediate(temp);
            var scriptPath = AssetDatabase.GetAssetPath(monoscript);
            var assetDir   = Path.GetDirectoryName(scriptPath).Replace("\\", "/") + "/Resources/";
            Directory.CreateDirectory(assetDir);
            var assetPath = assetDir + ResourceFilenameAttribute.Get <T>() + ".asset";
            s_instance = AssetDatabase.LoadAssetAtPath <T>(assetPath);
        }
        #endif
    }
    private static void ProcessDependencies()
    {
        ResourceSingletonBuilder.BuildResourceSingletonsIfDirty();

        var so = new UnityEditor.SerializedObject(instance);

        var types = new string[] { ".cs", ".js" };

        var allScriptPaths = Directory.GetFiles("Assets", "*.*", SearchOption.AllDirectories)
                             .Where(s => types.Any(x => s.EndsWith(x, System.StringComparison.CurrentCultureIgnoreCase)))
                             .ToArray();

        instance.m_serializedItems.Clear();

        for (int i = 0; i < allScriptPaths.Length; ++i)
        {
            UnityEditor.MonoScript script = UnityEditor.AssetDatabase.LoadAssetAtPath(allScriptPaths[i], typeof(UnityEditor.MonoScript)) as UnityEditor.MonoScript;

            if (!script || script.GetClass() == null)
            {
                continue;
            }

            var type = script.GetClass();
            if (!typeof(Component).IsAssignableFrom(script.GetClass()) &&
                !typeof(ScriptableObject).IsAssignableFrom(script.GetClass()))
            {
                continue;
            }

            var typeExecutionOrder = UnityEditor.MonoImporter.GetExecutionOrder(script);
            if (typeExecutionOrder == 0)
            {
                continue;
            }

            instance.m_serializedItems.Add(new SerializedItem()
            {
                typeName       = type.FullName,
                executionOrder = typeExecutionOrder,
            });
        }

        so.Update();
        instance.hideFlags = HideFlags.NotEditable;
        UnityEditor.EditorUtility.SetDirty(instance);
        UnityEditor.AssetDatabase.Refresh();
    }
    private static void ProcessDependencies()
    {
        ResourceSingletonBuilder.BuildResourceSingletonsIfDirty();

        var types = new string[] { ".cs", ".js" };

        var allScriptPaths = Directory.GetFiles("Assets", "*.*", SearchOption.AllDirectories)
                             .Where(s => types.Any(x => s.EndsWith(x, System.StringComparison.CurrentCultureIgnoreCase)))
                             .ToArray();

        for (int i = 0; i < allScriptPaths.Length; ++i)
        {
            UnityEditor.MonoScript script = UnityEditor.AssetDatabase.LoadAssetAtPath(allScriptPaths[i], typeof(UnityEditor.MonoScript)) as UnityEditor.MonoScript;
            if (!script || script.GetClass() == null)
            {
                continue;
            }
            if (!typeof(Component).IsAssignableFrom(script.GetClass()))
            {
                continue;
            }

            var type       = script.GetClass();
            var attributes = (ComponentDependencyAttribute[])type.GetCustomAttributes(typeof(ComponentDependencyAttribute), true);
            if (attributes.Length == 0)
            {
                continue;
            }

            var dependencies = attributes
                               .Where(x => x != null)
                               .SelectMany(x => x.GetComponentDependencies())
                               .ToArray();

            ProcessAll_SetDependencies(type, dependencies);
        }
    }