Unity框架学习--资源管理器

这篇具有很好参考价值的文章主要介绍了Unity框架学习--资源管理器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

资源加载方案

1、Inspector窗口拖拽
        在脚本中用public声明变量,然后在Inspector窗口把要加载的资源拖拽给该脚本的变量。
        不建议在大型项目使用。在公司的项目也不要用。
        如果你是独立游戏开发者,则可以用。
        不支持热更新。

2、Resources
        用Resources.Load方法、Resources.LoadAsync方法、Resources.LoadAll方法来加载资源。
        可以在商业项目使用,包括公司的项目。但是Resources文件夹中可以存放的资源有限,大概只能存储2G左右的资源,因此要谨慎使用。
        不支持热更新。

3、AssetBundle
       用AssetBundle.LoadFromXXX方法来加载资源。
       商业项目常用的资源加载方案,如果你在公司做项目,则推荐用这种方式来加载资源。
       效率比Resources加载高,占用内存小,正式发布游戏后,资源所占用的空间也小。
       支持热更新。

4、Addressables(可寻址资源系统)
      可以理解为高级的AssetBundle,资源管理由Unity内部自动完成。
      但是目前还在发展中,可能有bug。主流的商业游戏都是使用AssetBundle来做资源加载的。
       支持热更新。

5、AssetDatabase
      用AssetDatabase.LoadAssetAtPath方法来加载资源。
      仅限于编辑器模式,主要用于在编辑器模式下用代码更改本地文件。
      游戏运行时不会用这种方案加载资源。
      不支持热更新。

Resources 动态加载资源

使用前必须在项目中创建一个名叫Resources的文件夹,这个名字是固定的。

        在一个项目可以创建多个名叫Resources的文件夹,它们可以放在Assets文件夹中的任意位置,使用Resources的方法加载时,将对每个Resources文件夹进行查找。
        注意:如果一个项目中有多个Resources文件夹,则应确保里面的文件的相对路径不重复,如果重复,则使用Resources.Load方法加载时,只会加载找到的第一个该名字的文件。

在同一个文件夹中,文件名不要重名,如果实在要重名,则加载时要使用泛型加载指定的类型

使用Resources.Load或者Resources.LoadAll加载时,路径是从Resources文件夹里面的文件夹开始的,例如Resources文件夹里有一个Audio文件夹,Audio文件夹里面也有一个Music文件夹,Music文件夹有一个叫做Song的.mp3文件,则路径是"Audio/Music/Song"

路径中的文件名末尾一定不要写后缀,写了后缀反而加载不成功。

路径可以用反斜杠来写。"Audio/Music/Song"可以写成:
        "Audio\\Music\\Song"
        或者
        @"Audio\Music\Song"
不建议路径用反斜杠来写,建议统一都用正斜杠来写。

Resources.Load(string 要加载的资源的路径)
返回值是Object型。
同步加载Resources文件夹中的资源。
如果有多个相同路径的资源,则只会返回找到的第一个资源。

Resources.Load(string 要加载的资源的路径, System.Type 要加载的资源的类型的Type对象)
返回值是Object型。
同步加载Resources文件夹中的指定类型的资源。
如果有多个相同类型,且相同路径的资源,则只会返回找到的第一个资源。

或者使用函数重载指定类型:

GameObject go = Resources.Load("Prefabs/Cube",typeof(GameObject)) as GameObject;

Resources.Load<要加载的资源的类型>(string 要加载的资源的路径)
返回值是要加载的资源的类型。
同步加载Resources文件夹中的指定类型的资源。
如果有多个相同类型,且相同路径的资源,则只会返回找到的第一个资源。

Resources.LoadAll(string 要加载的资源的文件夹路径或文件路径)
返回值是Object[]型。
同步加载Resources文件夹中指定路径的文件夹中的所有资源,包括其中子孙文件夹中的所有资源,然后返回到一个Object[]型数组。
如果该路径是一个文件,则只会加载该文件,并返回到一个Object[]型数组。
如果没有加载到任何资源,则返回一个没有任何元素的Object[]型数组。

Resources.LoadAll(string 要加载的资源的文件夹路径或文件路径,System.Type 要加载的资源的类型的Type对象)
返回值是Object[]型。
同步加载Resources文件夹中指定路径的文件夹中的指定类型的所有资源,包括其中子孙文件夹中的该类型的所有资源,然后返回到一个Object[]型数组。
如果该路径是一个该指定类型的文件,则只会加载该文件,并返回到一个Object[]型数组。
如果没有加载到任何资源,则返回一个没有任何元素的Object[]型数组。

Resources.LoadAll<T>(string 要加载的资源的文件夹路径或文件路径)
同步加载Resources文件夹中指定路径的文件夹中的指定类型的所有资源,包括其中子孙文件夹中的该类型的所有资源,然后返回到一个Object[]型数组。
如果该路径是一个该指定类型的文件,则只会加载该文件,并返回到一个Object[]型数组。
如果没有加载到任何资源,则返回一个没有任何元素的Object[]型数组。

Resources.LoadAsync(string 要加载的资源的路径,UnityAction<Object> 资源加载完毕后要执行的逻辑)
返回值是ResourceRequest类型。
一般配合协程来使用。在协程中可以使用yield return来等待资源加载。
异步加载Resources文件夹中的资源。
如果有多个相同路径的资源,则只会加载找到的第一个资源。
回调的参数就是加载的资源。

if (GUI.Button(new Rect(150,0,150,80),"异步加载单个资源"))
        {
            StartCoroutine(LoadAsyncCoroutine());
        }

        IEnumerator LoadAsyncCoroutine()
        {
            //开始异步加载
            ResourceRequest resourceRequest = Resources.LoadAsync<GameObject>("Prefabs/Cube");
            //等待资源加载完毕
            yield return resourceRequest;
            //加载成功加载的资源--资源加载完毕后执行的逻辑
            Instantiate(resourceRequest.asset);
        }

Resources.LoadAsync(string 要加载的资源的路径,System.Type 要加载的资源的Type对象,UnityAction<Object> 资源加载完毕后要执行的逻辑)
返回值是ResourceRequest类型。
一般配合协程来使用。在协程中可以使用yield return来等待资源加载。
异步加载Resources文件夹中指定类型的资源。
如果有多个相同路径的资源,则只会加载找到的第一个资源。
回调的参数就是加载的资源。

Resources.LoadAsync<要加载的资源的类型>(string 要加载的资源的路径,UnityAction<要加载的资源的类型> 资源加载完毕后要执行的逻辑)
返回值是ResourceRequest类型。
一般配合协程来使用。在协程中可以使用yield return来等待资源加载。
异步加载Resources文件夹中指定类型的资源。
如果有多个相同类型,且相同路径的资源,则只会加载找到的第一个资源。
回调的参数就是加载的资源。

经用Resources.Load、Resources.LoadAsync、Resources.LoadAll加载的资源,即使在场景中没有使用,它们也会占用内存,此时要释放它们,就可以使用Resources.UnloadUnusedAssets方法和Resources.UnloadAssets方法。

Resources.UnloadUnusedAssets
返回值是AsyncOperation型。
异步卸载所有用Resources方式加载到内存中且当前没有被任何地方使用的资源。
可以配合协程使用。
例如要卸载某一个用Resources方式加载的预制体,则必须确保场景中所有这个预制体创建的物体都被销毁了,且这个预制体资源没有赋值给任何脚本中的任何变量。
如果有,可以把该变量也赋值为null,这样本方法才能成功释放它。

Resource.UnloadAsset(Object 要卸载的资源)
无返回值。
卸载指定的资源。
只能卸载非GameObject类型和Component类型,例如Mesh、Texture、Material、Shader。如果卸载了不让卸载的资源,则会报错。
如果随后加载的任何场景或资源引用了该资源,将导致从磁盘中加载该资源的新实例。此新实例将与先前卸载的对象相互独立。


Resources.FindObjectsOfTypeAll<要查找的类型>()
把已加载的指定类型的对象返回成指定类型的数组。
包括但不限于游戏对象、预制件、材质、网格、纹理等。
此方法还把Unity内部对象返回到该数组中,因此请小心处理返回的对象。
只要对象是指定的类型的,且已经加载了它,即使它是被禁用,也会被返回到该数组。

Resources.FindObjectsOfTypeAll(Type 要查找的类型的Type对象)
把已加载的指定类型的对象返回成Object[]型的数组。
包括但不限于游戏对象、预制件、材质、网格、纹理等。
此方法还把Unity内部对象返回到该数组中,因此请小心处理返回的对象。
只要对象是指定的类型的,且已经加载了它,即使它是被禁用,也会被返回到该数组。

Resources.InstanceIDToObject(int 对象的实例ID)
返回值是Object型。
根据对象的实例ID返回该对象。
对象的实例ID可以通过  对象.GetInstanceID()  获取。

同步 异步

同步:做一件事情,完成之后,再做下一件事情。事情必须做完一件再做另一件。

异步:做一件事情,开始做的时候,不等事情做完,就立即开始做下一件事情。多件事情可以一起做。

同步和异步最大的区别在于:同步会阻塞主线程,异步不会阻塞主线程。
 文章来源地址https://www.toymoban.com/news/detail-658334.html

封装ResourcesManager的异步加载

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;

/// <summary>
/// 资源管理器
/// </summary>
public class ResourcesManager : SingletonPatternBase<ResourcesManager>
{
    /// <summary>
    /// 异步加载Resources文件夹中指定类型的资源
    /// </summary>
    public void LoadAsync<T>(string path,UnityAction<T> callback = null) where T:Object
    {
        MonoManager.Instance.StartCoroutine(LoadAsyncCoroutine<T>(path, callback));
    }

    IEnumerator LoadAsyncCoroutine<T>(string path, UnityAction<T> callback = null) where T : Object
    {
        //开始加载资源
        ResourceRequest resourceRequest = Resources.LoadAsync<T>(path);
        //等待资源加载完毕
        yield return resourceRequest;
        //执行资源加载完毕后的动作
        callback?.Invoke(resourceRequest.asset as T);
    }

    /// <summary>
    /// 异步卸载资源,往往在切换场景的时候使用
    /// </summary>
    /// <param name="callback"></param>
    public void UnloadUnusedAssets(UnityAction callback=null)
    {
        MonoManager.Instance.StartCoroutine(UnloadUnusedAssetsCoroutine(callback));
    }

    IEnumerator UnloadUnusedAssetsCoroutine(UnityAction callback = null)
    {
        //开始卸载资源
        AsyncOperation asyncOperation = Resources.UnloadUnusedAssets();
        //等待资源卸载
        while(asyncOperation.progress < 1)
        {
            //等待一帧
            yield return null;
        }
        //资源卸载之后的逻辑
        callback?.Invoke();
    }
}

到了这里,关于Unity框架学习--资源管理器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • unity资源管理方案-YooAsset的使用

    我们在开发项目时,会发现资源管理模块往往在项目架构中扮演着重要的角色,而且一个游戏的流畅性和内存方面的性能优化,往往也能看到资源管理的影子,所以一个优秀强大的资源管理方案对一个项目开发者来说是一个强大的轮子。 YooAsset是一套用于Unity3D的资源管理系统

    2024年01月20日
    浏览(32)
  • Unity Addressables资源管理 主设置面板

    Addressables资源管理总目录 位置1 位置2     这个是全局路径配置的选择 可以点击 Manager Profiles 打开路径配置面板 打包路径设置   Send Profiler Events  打开这个选项,才能在Event Viewer窗口看到资源的事件 Log Runtime Exceptions  记录运行时的异常日志   默认情况下Addressables只记录警告

    2024年02月13日
    浏览(36)
  • Unity AssetBundles资源管理和热更新

    项目中的做法,在项目中一般会把资源按照文件目录去划分资源,以文件路径的名字作为AB的名字,一般都是把资源的这些放到预处理中。 一般会分为几个类型,比如把单个文件夹下的每个资源进行打bundle,把单个文件夹下的所有资源打成bundle,还有自定义bundle名字的类型啥

    2024年01月21日
    浏览(29)
  • Unity 如何基于addressable来做资源管理

    一、什么是Addressable系统 Addressable系统是Unity 2018.3版本中推出的一种资源管理方案,它可以帮助我们更好地管理游戏中的资源。在以往的游戏开发中,我们通常使用Resources来进行资源加载,但是这种方式存在很多问题,比如加载速度慢、内存占用高等。Addressable系统可以解决这

    2024年02月16日
    浏览(21)
  • Unity Addressables资源管理 安装和使用本地加载

    Addressables资源管理总目录 1.安装 打开Unity内置的 PackagerManager窗口 搜索Add即可找到 安装版本为1.19.19 2.添加Group 点击 Group 菜单 打开窗口 点击 Create Addressables Settings 创建可寻址设置 Assets下会生成一个  AddressableAssetsData 文件夹 其中可以看见面板中的  Default Local Group  默认组 资

    2023年04月13日
    浏览(22)
  • Unity资源管理(AssetBundle加载和卸载)及内存管理(内存的申请和释放)

    GameObject, Transform, Mesh, Texture, Material, Shader, Script和各种其他Assets。 静态引用,在脚本中加一个public GameObject变量,在Inspector面板中拖一个prefab到该变量上,然后在需要引用的地方Instantiate; Resource.Load,资源需要放在Assets/Resources目录下; AssetBundle.Load, Load之后Instantiate。 GameOb

    2024年02月16日
    浏览(25)
  • Unity的AssetBundle资源运行内存管理的再次深入思考

      大家好,我是阿赵。   这篇文章我想写了很久,是关于Unity项目使用AssetBundle加载资源时的内存管理的。这篇文章不会分享代码,只是分享思路,思路不一定正确,欢迎讨论。   对于Unity引擎的资源内存管理,我猜很多朋友都存在一定的疑惑。疑惑的点有非常多,包

    2024年03月22日
    浏览(25)
  • 小游戏资源上传工具:Unity上传OSS管理详解

    本文将为您提供使用Unity上传OSS(对象存储服务)管理的详细步骤和说明。通过这个工具,您可以方便地将小游戏资源上传至OSS,并进行管理和访问。 使用前置步骤在《微信小游戏游戏上线之路:教你如何免费获得CDN服务器》 确保您已经在阿里云上创建了一个OSS存储空间,并

    2024年01月21日
    浏览(32)
  • Unity3d:GameFramework解析:实体,对象池,资源管理,获取计数,引用计数,自动释放

    1.GF万物基于引用池IReference 2.ObjectBase : IReference类的m_Target持有unity中Mono,资源,GameObejct 3.AssetObject : ObjectBase类m_Target持有Assetbundle中的Asset,具有获取,引用两个计数管理释放 4.ResourceObject : ObjectBase类m_Target持有Assetbundle,具有获取,引用两个计数管理释放 5.EntityInstanceObject :

    2024年02月11日
    浏览(20)
  • 在unity里面双击脚本文件,系统自动打开vs之后,界面上没有“解决方案资源管理器”

    在unity里面双击脚本文件,系统自动打开vs之后,界面上没有“解决方案资源管理器”,写部分代码的时候也没有提示。然后在视图里把“解决方案资源管理器”调出来之后上面也不显示这个项目 解决方法: 检查一下Unity 和 Visual Studio 有没有关联 1、打开 Unity项目 2、选择顶部

    2024年02月05日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包