Unity资源加载方式

文章介绍了Unity中的特殊资源目录,如Resources、StreamingAssets和自定义AssetBundle,以及它们的加载方式和应用场景。在游戏开发和发布后,资源管理采用不同的策略,开发阶段使用Resources加载,发布后通过AssetBundle实现热更新,以优化加载和更新流程。

一、Unity特殊资源目录

  • Resources:逻辑资源目录,这个目录中的资源会打入到包中,不允许热更。在打包时会被压缩和加密。

  • 加载方式:Resources.Load(常用) 、 AssetDatabase.LoadAssetAtPath等加载接口

  • StreamingAssets:Raw资源目录,这个目录中的资源也会打入到包中,且允许程序通过Application.streamingAssetsPath读取(移动平台不允许写入)。资源会原封不动的打入包中,因此StreamingAssets主要用来存放一些二进制文件(视频等流文件)。

  • 加载方式:AssetDatabase.LoadAssetAtPath

  • Editor Default Resources:编辑器Editor资源,不展开讨论。

  • ResForAssetBundles(可自定义名称):自定义的AssetBundle包,用于热更。

  • 加载方式:BundleInst.LoadAsset(常用) 、AssetDatabase.LoadAssetAtPath 等加载接口

二、Unity实现资源管理器的思路

在游戏发布后,为了能够最及时的修复bug和更新玩法,我们需要将资源以AssetBundle的形式打包,使玩家可以通过热更新获得最新的内容。但是在游戏开发阶段,unity工程目录是程序,美术,策划共享的,这一时期资源变化很频繁,每次资源的变化都打包AssetBundle是不实际的。所以,我们需要封装资源加载功能的实现,使其在PC和原生有不同的实现方式:

  • PC:从Resources中加载。即用:Resources.Load 、AssetDatabase.LoadAssetAtPath 等接口实现加载。

  • 原生:从AssetBundle中加载资源和场景,需要处理依赖资源的加载。即用:BundleInst.LoadAsset 等接口实现加载。

另外加载后,都可以用缓存来实现读取。

<think> 我们参考了上述引用内容,总结出Unity资源加载的几种主要方式。根据引用[1],Unity提供了5种资源加载方式:Resources、AssetBundle、WWW、AssetDatabase和UnityWebRequest。下面将详细说明这几种方式及其特点: 1. **Resources加载**: - 只能加载放置在项目中`Resources`文件夹内的资源。 - 使用`Resources.Load`方法进行加载。 - 引用[1]提到这种方式只能加载特定目录下的资源。 2. **AssetBundle加载**: - 将资源打包成AssetBundle(AB包)文件,可以放在本地或远程服务器。 - 加载步骤:首先加载AB包,然后从AB包中加载具体资源。 - 引用[2]展示了使用`AssetBundle.LoadFromFile`加载本地AB包并实例化资源的例子: ```csharp AssetBundle ab = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/fox"); Instantiate(ab.LoadAsset<GameObject>("fox")); ``` - 引用[3]和[4]也提到这是商业化项目常用的方式。 3. **WWW加载**(已过时): - 可以加载任意位置的资源,包括远程资源。 - 但引用[1]提到这是较老的方式,现在推荐使用`UnityWebRequest`替代。 4. **AssetDatabase加载**: - 只能在编辑器中使用(`Editor`目录下),用于加载`Assets`目录下的资源。 - 引用[1]和[4]提到这种方式仅用于开发阶段。 5. **UnityWebRequest加载**: - 是WWW的升级版本,用于从网络加载资源(如远程服务器上的AssetBundle)。 - 引用[1]指出它可以加载任意位置的资源。 此外,引用[4]和[5]还介绍了如何将资源打包成AssetBundle(打AB包)的方法,需要在编辑器下编写脚本,并放在`Editor`文件夹中。打包示例: ```csharp using UnityEditor; public class BuildAssetBundle { [MenuItem("Tools/打AB包")] public static void BuildAB() { BuildPipeline.BuildAssetBundles(Application.streamingAssetsPath, BuildAssetBundleOptions.ChunkBasedCompression, BuildTarget.StandaloneWindows64); AssetDatabase.Refresh(); Debug.Log("打包完成"); } } ``` 总结Unity资源加载方式: - **运行时**常用:Resources、AssetBundle、UnityWebRequest。 - **编辑器**专用:AssetDatabase。 - **过时方式**:WWW(不推荐)。 注意:选择加载方式时需考虑资源位置(本地/远程)、平台兼容性以及性能等因素。例如,AssetBundle适合热更新,Resources加载会增加初始包体大小[^1][^3]。 §§相关问题§§ 1. Resources加载方式有什么优缺点? 2. 如何实现AssetBundle的资源热更新? 3. UnityWebRequest加载远程资源的步骤是什么? 4. 为什么说WWW已经过时?它与UnityWebRequest的主要区别是什么? </think> 根据引用内容,Unity 资源加载主要有以下 5 种方式,每种方式有其特定使用场景和限制: ### 1. **Resources 加载** - **特点**:只能加载 `Resources` 目录下的资源 - **语法**: ```csharp GameObject obj = Resources.Load<GameObject>("资源路径/名称"); ``` - **限制**:资源必须放在项目内 `Assets/Resources` 目录中,打包后无法修改[^1][^3]。 ### 2. **AssetBundle 加载** - **特点**:官方推荐的商业化方案,支持热更新 - **流程**: 1. 打 AB 包(需编辑器脚本): ```csharp [MenuItem("Tools/打AB包")] public static void BuildAB() { BuildPipeline.BuildAssetBundles( Application.streamingAssetsPath, BuildAssetBundleOptions.ChunkBasedCompression, BuildTarget.StandaloneWindows64 ); AssetDatabase.Refresh(); } ``` 2. 运行时加载: ```csharp // 从本地加载 AssetBundle ab = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/包名"); GameObject fox = ab.LoadAsset<GameObject>("fox"); Instantiate(fox); ``` - **优势**:支持本地/远程加载资源可动态更新[^1][^3][^4]。 ### 3. **UnityWebRequest (WWW 升级版)** - **特点**:WWW 的替代方案,支持网络资源加载 - **语法**: ```csharp UnityWebRequest request = UnityWebRequest.Get("http://xxx/资源包"); yield return request.SendWebRequest(); AssetBundle ab = DownloadHandlerAssetBundle.GetContent(request); ``` - **适用场景**:远程服务器资源加载[^1]。 ### 4. **AssetDatabase (仅编辑器可用)** - **特点**:开发调试专用,仅限 Editor 模式 - **语法**: ```csharp #if UNITY_EDITOR GameObject prefab = AssetDatabase.LoadAssetAtPath<GameObject>("Assets/路径.prefab"); #endif ``` - **限制**:不能用于运行时,仅加载 `Assets` 目录内资源[^1][^4]。 ### 5. **WWW (已过时)** - **特点**:旧版网络加载方案,Unity 推荐改用 `UnityWebRequest` - **语法**: ```csharp WWW www = new WWW("http://xxx/资源"); yield return www; AssetBundle ab = www.assetBundle; ``` - **注意**:新项目应避免使用[^1][^3]。 --- ### 选择建议 | 方式 | 适用场景 | 资源位置限制 | |-------------------|----------------------------------|-------------------| | Resources | 静态基础资源(如UI图标) | 仅Resources目录 | | AssetBundle | 动态资源/热更新 | 任意可访问路径 | | UnityWebRequest | 远程服务器资源 | 无限制 | | AssetDatabase | 编辑器调试 | 仅Assets目录 | | WWW | 旧项目兼容(不推荐新项目使用) | 无限制 | > 关键区别:**Resources** 增加初始包体积但使用简单;**AssetBundle** 支持按需加载,适合大型项目;**UnityWebRequest** 专为网络资源设计[^1][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT外猩人

如果觉得有帮助,可以小小赞赏哦

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值