Unity 利用Cache实现边下边玩

unity,cache · 浏览次数 : 0

小编点评

**当前手机游戏的常规更新方案及其局限性** 在现代手机游戏中,常规的资源更新方案通常是在启动时下载并安装所有资源,以确保游戏质量和用户粘性。然而,这种方法存在一些问题,如文件大小较大、下载时间较长等。 为解决这些问题,一些游戏开始采用资源缓存方案,如微信、抖音小游戏所采用的方案。这种方案可以在游戏运行过程中边下载边播放,从而减小首包大小,提高用户体验。但实现起来相对复杂,需要对Unity内部的Caching机制有一定了解。 **资源方案:AssetBundle** AssetBundle是一种用于打包资源的机制,它可以将游戏中的各种资源(如场景、角色、音效等)打包成一个或多个文件。在游戏运行时,可以根据需要动态加载这些资源。为了更好地管理这些资源,Unity推出了Addressable AssetBundles,它解决了AssetBundle之前的一些问题,如资源的动态加载、版本控制等。 在打包AssetBundle时,可以通过调用`SBP ContentPipeline.BuildAssetBundles()`方法获取资源的hash值,并将其传递给`UnityWebRequestAssetBundle.GetAssetBundle()`方法以获取资源。在加载AssetBundle时,可以使用一个哈希值和一个校验和(CRC)来验证资源的完整性和正确性。 **加载AB时的缓存机制** 在Unity中,可以使用`UnityWebRequestAssetBundle`类来加载AssetBundle。为了实现边下边玩的机制,需要设置相应的缓存机制。具体来说,可以在加载AssetBundle时指定一个哈希值和一个校验和。如果请求的AssetBundle与本地缓存中的资源匹配,则从缓存中加载资源;否则,从网络上下载新的资源。 需要注意的是,hash值并不一定是资源的实际哈希值,而只是一个版本号。只要请求时对应的资源在缓存中存在,就会下载新的资源;否则,将读取缓存中的资源。如果未指定hash参数,则默认值为0,表示不进行校验。 校验和(CRC)用于验证资源的完整性和正确性。如果请求的AssetBundle与本地缓存中的资源匹配,则校验和应该相同。如果校验和不匹配,`UnityWebRequest.downloadHandler.error`属性将被设置为错误状态,并且无法加载资源。 **优缺点** 优点: 1. 简单易用:只需更改一下代码即可实现边下边玩的机制。 2. 资源管理灵活:可以根据需要将部分资源放入包内,部分资源边下载边播放。 3. 资源更新方便:当需要更新资源时,只需上传新的AssetBundle即可,无需对现有资源进行修改。 缺点: 1. 精确度较低:无法对单个文件进行完整性检查,如果资源出现问题,可能需要重新下载整个包。 2. 可能影响性能:如果资源文件较大,下载时间可能会较长,从而影响用户体验。 **结论** 综上所述,使用Unity内部的Caching机制实现边下边玩的机制是一种简单易行的方法。虽然实现起来相对复杂,但对于希望优化游戏体验和降低运营成本的开发者来说,这是一个值得考虑的选择。

正文

现在手机游戏的常规更新方案都是在启动时下载所有资源更新,游戏质量高的、用户粘性大的有底气,先安装2个G,启动再更新2个G,文件小了玩家还觉得品质不行不想玩。
最近在做微信、抖音小游戏,使用他们提供的资源缓存方案,现在要转成Android APP, 也想用这种边下边玩的机制把首包做小。
其实很简单,直接用Unity内部的Caching机制即可,但是因为没怎么接触过,一开始用的就是那种启动时下载资源更新的方案,反而绕了一些弯路。

资源方案:AssetBundle (现在推Addressable的比较多,解决了AssetBundle难以处理的一些问题,但是比较久的项目肯定都对AssetBundle进行了相应的封装来处理这些问题,没有本质区别)

1. 打包AssetBundle时获取hash

调用自己封装的SBP ContentPipeline.BuildAssetBundles(), 遍历IBundleBuildResults.BundleInfos可以取到对应的hash和crc,
如果用旧的BuildPipeline.BuildAssetBundles(), 也可以通过manifest取到对应的hash,但如果想拿到crc,需要手动传参数进去。
另外,需要设置打包压缩格式为LZ4。默认的LZMA会重新压缩成LZ4,造成比较明显的卡顿。

2. 加载AB时的缓存机制

  var uwr = UnityWebRequestAssetBundle.GetAssetBundle(url, hash, crc);

怎么样,是不是非常简单?只需要填上hash参数,就可以依靠Unity内部机制实现边下边玩。hash也不一定是hash,实际作用只是一个版本号,只要请求的时候对应的版本的资源在缓存中存在,就会下载新的,否则就读缓存中的,如果不填这个参数就是默认值0)
crc参数是用来校验的,如果AB和调用时的crc对不上,uwr.downloadHandler.error会表现出来,并且取不到资源。默认值0表示不进行校验

3. 优缺点

优点自然是非常简单,改一下就能用,如果要部分资源放进包里,部分资源边下边玩,改一下判断就行。
缺点是没法精细操作,资源出问题了最简单粗暴的就是直接Caching.ClearCache,没有办法对单个文件进行完整性检查。

与Unity 利用Cache实现边下边玩相似的内容:

Unity 利用Cache实现边下边玩

现在手机游戏的常规更新方案都是在启动时下载所有资源更新,游戏质量高的、用户粘性大的有底气,先安装2个G,启动再更新2个G,文件小了玩家还觉得品质不行不想玩。 最近在做微信、抖音小游戏,使用他们提供的资源缓存方案,现在要转成Android APP, 也想用这种边下边玩的机制把首包做小。 其实很简单,直

基于助听器开发的一种高效的语音增强神经网络

现代语音增强算法利用大量递归神经网络(RNNs)实现了显著的噪声抑制。然而,大型RNN限制了助听器硬件(hearing aid hardware,HW)的实际部署,这些硬件是电池供电的,运行在资源受限的微控制器单元(microcontroller units,MCU)上,内存和计算能力有限。在这项工

Unity 编辑器中获取选中的文件夹、文件路径

编辑器中获取选中的文件夹、文件路径 using UnityEditor; using UnityEngine; using Object = UnityEngine.Object; public class MyEditorScript { [MenuItem("Assets/PrintSelect

扩展实现Unity协程的完整栈跟踪

现如今Unity中的协程(Coroutine)方案已显得老旧,Unitask等异步方案可以直接解决如异常捕获等各类问题, 并且Unity官方也在开发一套异步方案,但现阶段还是需要在协程这个方案上继续琢磨。 Unity协程中无法输出完整的栈跟踪,因为协程编译后会转换为IL编码的状态机,中间存在栈回到堆

Unity三维数学总结

三维向量和三角函数 三维向量 向量是指一个同时具有大小和方向,且满足平行四边形法则的几何对象。 向量的模 po点相对于世界坐标原点的距离: po.magnitude。 标准向量,归一向量,指的是将向量的模变成1,方向不变。改变后的向量: po.normalized。 向量的方向 求向量的方向(求向量

[Unity] 实现AssetBundle资源加载管理器

实现Unity AssetBundle资源加载管理器 AssetBundle是实现资源热更新的重要功能,但Unity为其提供的API却十分基(jian)础(lou)。像是自动加载依赖包、重复加载缓存、解决同步/异步加载冲突,等基础功能都必须由使用者自行实现。 因此,本篇博客将会介绍如何实现一个Ass

Unity热更学习toLua使用--[1]toLua的导入和默认加载执行lua脚本

[0]toLua的导入 下载toLua资源包,访问GitHub项目地址,点击下载即可。 将文件导入工程目录中: 导入成功之后会出现Lua菜单栏,如未成功生成文件,可以点击Generate All 重新生成(注意很可能是路径问题导致的生成失败!) 之后就可以开始编写脚本执行第一个lua程序了! [1]

Unity开发Hololens2—环境配置

> 博客地址:https://www.cnblogs.com/zylyehuo/ * ![](https://img2023.cnblogs.com/blog/3071480/202304/3071480-20230405201857570-1161269618.png) > 配置如下: > win

Unity开发Hololens2—交互发布配置

> 博客地址:https://www.cnblogs.com/zylyehuo/ ## 环境配置 ```bash unity2021.3.15f visual studio 2019 pro MRTK 2.8.3 OpenXR 1.8.0 Hololens2 ``` > Hololens2 环境配置

Unity框架与.NET, Mono框架的关系

什么是C# C#是一种面向对象的编程语言。 什么是.NET .NET是一个开发框架,它遵循并采用CIL(Common Intermediate Language)和CLR(Common Language Runtime)两种约定, CIL标准为一种编译标准:将不同编程语言(C#, JS, VB等)使