Unity 基础 之 Resources加载和卸载介绍

1,826 阅读2分钟

这是我参与8月更文挑战的第30天,活动详情查看:8月更文挑战

资源加载

加载贴图

实现步骤:

  1. 创建Image,并创建脚本ResImageTest挂载其上
  2. 将名称为“Unity”图片导入到命名为“Resources”的文件夹下
  3. 将图片格式转换为“Sprite(2D and UI)”
  4. 编写代码,运行即可

工程中文件夹:

图片格式:

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");
    }
}

加载音频

实现步骤:

  1. 创建空物体,在其上添加AudioSource组件
  2. 将音频导入到命名为“Resources”的文件夹下
  3. 编写代码,并将代码挂载到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);
	  }
}

资源卸载

  1. Resources.UnloadUnusedAssets卸载所有没有引用的资源

  2. Resources.UnloadAsset卸载单个资源,只能卸载单个基础资源(如Texture,Sprite),不能卸载GameObject。

  3. Resources.UnloadAsset卸载,Sprite只会卸载Sprite组件,和Texture2D关联,不会卸载Texture2D图片,需要在调用Resources.UnloadUnusedAssets,才会卸载Texture2D图片。因此卸载Sprite后场景中引用了该Sprite的物体不受影响,只有再调用Resources.UnloadUnusedAssets后,图片信息才会丢失。

  4. Resources.UnloadAsset卸载,Texture2D图片会直接被卸载,场景的图片信息回直接丢失。

  5. Resources.UnloadUnusedAssets可以卸载内存中的GameObject,需要先把引用的变量设置为null


其他概念

索引信息其实就是一个序列化的查找树,用来定位资源名字到资源的file guid和local ID, 同时用于查找这个资源本身。

在大部分的平台上,查找树是BST, 其构建的时间复杂度为O(nlog(n)), 构建的时间会随着n的增大而增大(资源数越多构建时间越久)

在游戏启动的时候,这个BST树构建的过程是无法跳过的,如果Resources下的资源数目超过10,000,在低端手机上其占用的启动时间会达到几秒。而事实上这些资源索引并不是全部需要预先加载的,这会降低游戏的性能。