资源加载和优化之编辑器Prefab

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/U3DJueQi/article/details/85092189

一,创建Prefab

函数:PrefabUtility.CreatePrefab(),需要提供保存的目录以及当前的游戏对象。

            ReplacePrefabOptions.ConnectToPrefab()表示创建的Prefab的同时自动关联到创建它的这个游戏对象。

[MenuItem("Assets/Tools/CreatePrefab",false ,3)]
    static void CreatePrefab()
    {
        if (Selection.activeTransform)
        {
            string path = "Assets/Prefabs/Test.prefab";
            //判断文件是否存在,如果存在删除
            if (AssetDatabase.LoadAssetAtPath<GameObject>(path))
            {
                AssetDatabase.DeleteAsset(path);
            }
           //创建新的Prefab传入三个参数,路径,对象,关联Prefab
            PrefabUtility.CreatePrefab(path, Selection.activeGameObject,                     
            ReplacePrefabOptions.ConnectToPrefab);
            //刷新视图
            AssetDatabase.Refresh();
        }
    }

在层级面板中选择一个想要创建Prefab的对象,然后点击Assets>>>>>Tools>>>>>CreatePrefab,就可以运行相关的函数。

二,实例化Prefab

在编辑器模式下我们通常使用PrefabUtility.InstantiatePrefab()方法来实例化Prefab,以及常用的FBX格式的资源,使用这种加载方式可以保持它的一些引用关系。(这方法用来保持原有的依赖关系,并非克隆一份新的)

我们通常使用transform.SetParent().第二个参数如果是false表示它不会被父坐标影响,会回归原点。

static void MyLoad()
    {
        if (Selection.activeTransform)
        {
            GameObject gameObject  = AssetDatabase.LoadAssetAtPath<GameObject>                
           ("Assets/Prefabs/Test.prefab");
            if (gameObject != null)
            {
                GameObject go = PrefabUtility.InstantiatePrefab(gameObject) as 
                GameObject;
                go.transform.SetParent(Selection.activeTransform,false);
            }
            else
            {
                Debug.LogError("资源加载失败!!!");
            }
        }
    }

三,更新Prefab

函数:使用PrefabUtility.ReplacePrefab()方法用来更新Prefab。

[MenuItem("Assets/Tools/ApplyPrefab", false, 4)]
    static void ApplyPrefab()
    {
        if (Selection.activeTransform)
        {
            //判断是否是Prefab
            Object prefab = PrefabUtility.GetPrefabObject(Selection.activeGameObject);
            //如果是
            if (prefab)
            {
              PrefabUtility.ReplacePrefab(Selection.activeGameObject,prefab,ReplacePrefabOptions.ConnectToPrefab);
            }
            //刷新Project视图
            AssetDatabase.Refresh();
        }
    }

四,卸载资源

在编辑器模式下我们使用GameObject.DestroyImmediate()方法来卸载游戏对象。如果需要卸载游戏对象的引用资源,则第二个参数是True,默认为false。

 [MenuItem("Assets/Tools/Delete", false, 5)]
    static void Delete()
    {
        if (Selection.activeTransform)
        {

            GameObject.DestroyImmediate(Selection.activeGameObject,true);
        }
    }

五,游戏对象与资源的一些关系

我们知道游戏对象与资源是一种引用关系。例如一个模型是Mesh和贴图组成的,当我们拖到场景中时,这个游戏对象也是会引用对应的贴图和Mesh的。通常我们删除游戏对象时,仅仅是把游戏对象给删除了呢,并没有卸载掉对应的引用,因为如果加载和卸载游戏对象很频繁,每次卸载都将引用卸载掉,这会造成IO的阻塞。但是如果是长时间不用这些资源,必然导致内存的增加,因此我们可以使用EditorUtility.UnloadUnusedAssetsImmediate()来卸载长时间不用的资源。

猜你喜欢

转载自blog.csdn.net/U3DJueQi/article/details/85092189