这是我参与8月更文挑战的第30天,活动详情查看:8月更文挑战
资源加载
加载贴图
实现步骤:
- 创建Image,并创建脚本
ResImageTest
挂载其上 - 将名称为“Unity”图片导入到命名为“Resources”的文件夹下
- 将图片格式转换为“Sprite(2D and UI)”
- 编写代码,运行即可
工程中文件夹:
图片格式:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class ResImageTest : MonoBehaviour
{
private Image m_Image;
void Start()
{
// 获取Image组件
m_Image = GetComponent<Image>();
// 泛型方式 读取Resource下图片文件,并赋值
m_Image.sprite = Resources.Load<Sprite>("Unity");
}
}
加载音频
实现步骤:
- 创建空物体,在其上添加
AudioSource
组件 - 将音频导入到命名为“Resources”的文件夹下
- 编写代码,并将代码挂载到1创建的物体上,运行即可
实现代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ResAudioTest : MonoBehaviour
{
// 音效组件
private AudioSource au;
// 音效文件
private AudioClip ac;
void Start ()
{
// 找的物体上的组件
au = gameObject.GetComponent<AudioSource>();
// 使用Resources类进行动态加载 必须和Resources文件夹对应
// 有多层文件夹的话需要用“/” 隔开,比如:“Sound/bmg”
// 除了上面示例中的泛型,也可以使用强制转换的方式
ac = (AudioClip)Resources.Load("bgm");
// 将音频剪辑给音源
au.clip = ac;
// 延时1s后播放
au.PlayDelayed(1);
}
}
资源卸载
-
Resources.UnloadUnusedAssets卸载所有没有引用的资源
-
Resources.UnloadAsset卸载单个资源,只能卸载单个基础资源(如Texture,Sprite),不能卸载GameObject。
-
Resources.UnloadAsset卸载,Sprite只会卸载Sprite组件,和Texture2D关联,不会卸载Texture2D图片,需要在调用Resources.UnloadUnusedAssets,才会卸载Texture2D图片。因此卸载Sprite后场景中引用了该Sprite的物体不受影响,只有再调用Resources.UnloadUnusedAssets后,图片信息才会丢失。
-
Resources.UnloadAsset卸载,Texture2D图片会直接被卸载,场景的图片信息回直接丢失。
-
Resources.UnloadUnusedAssets可以卸载内存中的GameObject,需要先把引用的变量设置为null
其他概念
索引信息其实就是一个序列化的查找树,用来定位资源名字到资源的file guid和local ID, 同时用于查找这个资源本身。
在大部分的平台上,查找树是BST, 其构建的时间复杂度为O(nlog(n)), 构建的时间会随着n的增大而增大(资源数越多构建时间越久)
在游戏启动的时候,这个BST树构建的过程是无法跳过的,如果Resources下的资源数目超过10,000,在低端手机上其占用的启动时间会达到几秒。而事实上这些资源索引并不是全部需要预先加载的,这会降低游戏的性能。