任务26:使用打包工具打包一个PC版本及从资源服务器下载资源
如果大家在这节完成后,使用打包工具却没能正确输出资源到WebRes资源目录,请重新下载Editor.zip替换一下Assets目录下的。
项目进行到这里,必须学习如何打包项目了。因为要测试多个客户端登录账号来调试游戏功能,还得多个人进入房间啊,而且也快到匹配三个玩家把地主斗起来了,总不能开三个unity运行来测试对吧。
对bundle打包与下载的理解
1、打包好的bundle资源文件在资源服务器上某目录下,比如WebRes目录
里面有新版StreamingAssets目录,带有Version.txt(记录着所有所在目录的资源文件Md5信息)
2、你打包发布后的游戏中有一目录叫\ {game}_Data\ ,{game}是指你发布的游戏名,我们课程项目就叫 Landlords_Data (下文用_Date表达)
里面有老版StreamingAssets目录,带有Version.txt
3、所以:WebRes上有最新的StreamingAssets,_Data目录有玩家之前安装好的游戏运行后已经下载到他本地的老版StreamingAssets
4、我们需要的是每次运行游戏时,下载WebRes上的Version.txt与_Data目录的Version.txt进行比较,发现服务器上的Version.txt中有新的资源文件,或者老的资源文件有变化,就会从WebRes上下载这些资源放到\ {game}_Data\StreamingAssets\目录下
5、让人炫晕的是,打包时我们会写代码,在项目的Assets目录下也创建了一个StreamingAssets。为什么?因为这里面的东西会在完成打包后,全部复制到_Data目录中
也就是说不需要下载,游戏安装时_Data目录就会有这个版本带有的资源文件和Version.txt文件
这是一个版本0状态下Version.txt中的内容 \Release\Landlords_Data\StreamingAssets\Version.txt
{"Version":0,"TotalSize":0,"FileInfoDict":{}}
扩展思考:
- 资源加载的过程中断了呢,再次打开程序重新加载资源会面临什么情况?
- 之前版本中部分资源被清理软件删除了,而那个版本Version文件还在,问题是不是变得复杂起来了?
- 如果出现需要重新安装客户端的大版本更新,需要在资源服务器创建不同目录来管理不同版本的StreamingAssets目录又怎么处理呢?
- 同一个大版本下,如果经历了很多次版本的叠加,我们每次打包测试时,难道都要下载几百M,几个G的资源包再运行?是不是想把中间一些关键小版本(1.2.2,1.3.4,1.5.1,1.7.4)管理起来,能不能做指定某个关键版本到某个关键版本之间的打包更新测试呢?
然而这些都只是你要心中有数的问题,并不是本节需要学习和解决的。
想跑先要学会走路对吧,所以本节打包与加载资源都是基于每次都从版本0,到最新版本的更新。(没错,就是完全无视上面这些问题,哈哈哈。。。)
本节课要做的操作
从本节开始前端提供了web资源服务项目的工程,还有编辑器扩展打包工具
1、起动本地资源服务器
这是用netcore开发的一个win程序,指定了本地的WebRes目录作为本地资源服务器根目录,起动资源服务器后可以浏览器访问
http://127.0.0.1:8080/PC/StreamingAssets
如果WebRes下没有PC目录,在下面创建PC目录,再在PC下创建StreamingAssets目录。
2、在unity中设置好资源服务器的地址
其实就是GlobalProto.txt文件挂到KV预制体上面。
GlobalProto中的内容是 {"AssetBundleServerUrl":"http://127.0.0.1:8080/","Address":"127.0.0.1:10002"}
Address是资源服务程序的地址与端口,AssetBundleServerUrl是浏览器中用来访问的url地址
如果是正式用远程服务器了,你就用真实的远程地址替换AssetBundleServerUrl的内容
3、本地开发项目,本课程的练习是这样安排目录结构的
- 打包输出在Release目录
- 起动本地资源服务器程序,这个程序是在FileServer目录下,unity里点web资源服务器,调用的就是他里面的FileServer.dll
- 资源服务器程序将WebRes作为了本地资源服务的根目录
所以我们项目打包时,就把bundle资源输出到了这个WebRes目录中,你使用远程服务器时,就把WebRes中的内容上传到远程服务器上就行(更换GlobalProto.txt中的地址,打包后就可以提供给玩家下载了)
4、在前端Init文件中添加下载ab包的代码
\Assets\Model\Init.cs
// 下载ab包 await BundleHelper.DownloadBundle();
记得要加在Config资源下载之前执行下载ad包
5、在unity中开始打包输出
设置好图中所示,点开始打包:
工具就会将bundle输出到WebRes目录,将游戏打包输出到Release目录,
将Assets下的StreamingAssets中的内容复制到\Release\ {game}_Data\StreamingAssets\下面。
提供给大家下载的打包工具,如果你需要修改输出目录,后面提供选修课时,介绍打包工具是如何开发和配置输出目录的。
6、打包输出完成后,我们比较一下WebRes与_Data下面的StreamingAssets中的情况
因为本课只考虑版本0到最新版本的下载,所以打包工具的代码处理是,每次打包输出时:
- 清空Assets目录下StreamingAssets和_Data目录下StreamingAssets中的内容。
- 在Assets目录下StreamingAssets中生成一个版本0的Version.txt文件,这样打包后的_Data目录下StreamingAssets中就会有这个版本0的Version.txt文件。
7、运行游戏后,再看_Data下面的StreamingAssets中的情况
玩家每次运行游戏,都会下载比较资源服务器上的Version文件,把最新的资源文件下载到他本地的_Data下面的StreamingAssets中。已经有的或者没有变化的资源,就不会再下载了。
通过本节学习,你明白了资源服务器上的,Assets目录里的,_Date目录里的StreamingAssets是什么作用和他们之间的关系了吗?
Assets目录里:作为一开始打包的游戏,需要复制到_Date目录,让游戏安装时的这个版本带有的资源文件和Version.txt文件
资源服务器上:最新版本的资源文件和Version.txt文件
_Date目录里:游戏运行加载和使用的资源
课外练习:
1、在完成本课的基础上,在项目里随便加一个预制体xxx,添加 xxx.unity3d的bundle,
2、_Date目录里复制StreamingAssets到别的地方,然后点打包工具进行打包
3、完成打包输出后,把前面放在别的地方的StreamingAssets,复制回_Date目录覆盖
3、观察资源服务器上资源文件是否增加,Version.txt文件里的版本号
4、从Release里运行游戏,界面显示后,到_Date目录里观察资源文件是否增加,Version.txt文件里的版本号
额外补充知识:
如果你的FileServer输出目录,和资源服务的文件根目录想放在跟我不一样的地方,你需要自己修改和编译FileServer的工程项目。
调试与输出时,要设置好对应的相对目录,比如基于我提供下载项目的目录结构是下面这样设置的:
文件服务器程序输出目录
文件服务器资源根目录
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)