一,创建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()来卸载长时间不用的资源。