我们都知道当我们打包时,Unity会自动的删除没有引用的资源,通常只有Resources和StreamingAssets两个文件夹下的资源。
如果一个场景被加入到Scenes In Build ,那么这个场景中在层级面板中的游戏对象都会被都会被打入大游戏包中,比如场景有一个(1)人物模型;
(2)模型中使用了材质A;
(3)材质中使用了贴图B。
这样在打包时已上的资源都会被打包。
但是人物模型如果不是在Resource或者StreamingAssets目录下,这模型是无法使用操作的,因为无法加载这资源。
Resources
在打包时Unity会将所有Resources自动合并在一起,这目录下的资源无论是否有引用关系,都会被强制打包在游戏中,我们可以使用代码动态的操作这些资源。
常用函数:Resources.Load<T>() 用来加载各类的游戏资源
比如 GameObject
GameObject obj=Resources<GameObject>("A");//对象
Material material=Resources<Material>("Mat");//材质
Sprite sprite=Resources<Sprite>("Logo");//Sprite
小贴士:为了减少包体的体积,我们需要将不需要运行时加载的资源,或者已经废弃掉的资源放进去。我们尽量不要在场景中直接引用Resources中的资源,这样会场景和Resources打包成两份。
删除对象
想要删除游戏对象,Unity为我们提供了两种方法,
(1)GameObject.Destory()
此方法方法会等一帧再彻底删除,因为可能在这一帧的后面有个地方再操作这个对象(一般推荐这种方法)
(2)GameObject.DestoryImmediate()
此法表示立即删除对象,如果后面一帧有使用该对象的地方会报错
删除资源
当我们删除游戏对象时,它引用的游戏资源并没有被删除掉。
Resources中提供了两种方法来删除游戏资源
Resources.UnloadAsset()
Resources.UnloadUnusedAssets()
//我们可以使用者两种方法来强制的删除游戏资源
因为卸载游戏资源时异步操作,因此我们可以使用IsDone来判断是否完成。
在删除掉游戏对象后,我们使用Resources.UnLoadUnusedAssets()来释放掉没有用的游戏资源
示例代码:
public GameObject prefab;
public AsyncOperation m_Async;
void Start () {
GameObject.Destroy(prefab);
//Resources.UnloadAsset(prefab);//强制卸载资源
m_Async = Resources.UnloadUnusedAssets();
}
void Update () {
//卸载时异步操作,我们在Undate中去判断是否卸载完毕
if (m_Async!=null)
{
if (m_Async.isDone)
{
Debug.LogFormat("资源:"+prefab.name+"卸载完成!");
}
}
}