Unity热更新爬坑记(二)

上次写热更已经有两年多时间了,上次记录用的是ILRuntime热更遇到的一些问题,因为工作上又没有用到了,所以也没做更多深入了。
这次记录的是使用Lua在各平台更新可能会遇到一些疑问的集合,大部份可能大家本身是知道的,我觉得这里面但凡有一两条能给大家做个提醒我觉得这些记录就是值得的。

本文将持续更新,与更正如果大家有踩过哪此坑可以留言给我,让更多的人知道。

一、使用www加载文本是乱码,已知格式为UTF-8的可以通过以下方式转:
获取时取得Byte[]
如是UnityWebRequest:
byte[] results = www.downloadHandler.data;
旧的www:
byte[] results = www.bytes;

string jsondata = System.Text.Encoding.UTF8.GetString(results, 3, results.Length - 3);

二、无法写入StreamingAsset的目录下的文件
AB包需存放在StreamingAsset目录可打在包内,但无法写入。因而需要将其拷贝到Application.persistentDataPath的地址下进行读写。

三、无法读取StreamingAsset目录下所有文件
可以考虑在PC时读取生成,以XML或json等方式存取目录及文件。

四、获取指定目录下所有文件
DirectoryInfo dirInfo = new DirectoryInfo(path);
FileInfo[] files = dirInfo.GetFiles(“*”, SearchOption.AllDirectories);
android读取StreamingAsset下目录是不可用的

五、读写目录差异问题
StreamingAsset读取文件:
Android读取StreamingAsset:Application.streamingAssetsPath + “/文件名.txt”;
IOS读取StreamingAsse:“file://” + Application.streamingAssetsPath+“/文件名.txt”; (注意这里是两杠)
PC读取StreamingAsse: Application.streamingAssetsPath+“/文件名.txt”;

persistentDataPath读写入文件:
PC读写 persistentDataPath 都可以直接用: Application.persistentDataPath+ “/文件名.txt”
Android写入:Application.persistentDataPath
Android读取: “file:///”+Application.persistentDataPath+ “/文件名.txt”
IOS写入:Application.persistentDataPath+ “/文件名.txt”
IOS读取::“file://”+ Application.persistentDataPath+ “/文件名.txt”

方法差异比如:Android平台的AssetBundle.LoadFromFile方法的读取方法则是:
Application.persistentDataPath+ “/文件名.txt”
IOS和OSX也是不用写"file://"

各平台目录不一样,路径拼接需要了解各路径的含义,比如在移动端:
application.datepath + “streamingAsset” 不等于 application.streamingAsset

六、什么是热更的MD5
将文件字节转字符串后通过MD5加密,得到一串代码,用于作为对比得知道文件是否有改动。

七、如何通过后缀过滤文件
可以使用方法:!files[i].Name.EndsWith(“.meta”)

八、如何通过路径获得需要的Object
Object o = AssetDatabase.LoadAssetAtPath(路径);
路径内容为:项目根目录Asset开始的,可以使用以下方式用全路径裁剪
int strStart = FullName.IndexOf(“Asset”);
int strLength = FullName.Length - strStart;
string path = FullName.Substring(strStart, strLength);

九、依赖问题
可以考虑使用AssetBundlesBrowser插件进行管理这个是最方便的,使用BuildPipeline.BuildAssetBundles打包则会将多个文件打到一个包中,依赖关系则存在主包中。
而我选择使用BuildPipeline.BuildAssetBundle逐个打包成AB包,为了单个更新时可以不用整个包一起下载,但包体较大。

十、自己写AB包流程还是使用插件流程
个人参考照了几位大神的意见,认为是自己写会比较好。
原因是每个项目的需求是不一样的,而且也可以最大程度的机器节省工作量。
打包流程下来,生成版本、资源列表与MD5文件、修改文件对比、AB包加密等整套流程可以用最简洁的方式实现。

十一、AB包怎么加密
文件的本质都是字节,使用打乱字节串的方式加密即可,这里暂不细说。
AB包名字使用文件名+MD5

十二、Android同步读取StreamingAsset文件夹下的文件
查阅读了不少资料,Andriod只能通过www的方式异步读取,IOS可以同步读取。
或是需要将工程导出到android打包,将StreamingAsset放到assets目录下来读取。
参考:https://www.xuanyusong.com/archives/4033
或是拷贝到persistentDataPath后,使用AssetBundle.LoadFromFile(PathURL)读取

十三、Android同步读取StreamingAsset文件夹下AB包文件
1.Android下application.streamingAssetPath返回的是以jar:file://开头的,要将这断去掉才能正常使用,因而需要如下判断
public static string path =
#if UNITY_ANDROID
Appliction.datePath+“!assets”;
#else
Application.streamingAssetsPath;
#endif
AssetBundle.LoadFromFile(path+“/”+“文件名”)

十四、如何存放热更的资源
1.使用本地IIS(Unity热更新爬坑记中有细讲)
2.让后端同学帮忙给个地址空间
3.购买学习的域名地址,共大概几十块钱。

十五、AssetBundle.LoadFromFile
是一种高效API,用于从本地加载未压缩或LZ4压缩格式的AB包

十六、判断各平台文件是否存在
都是用这个,不存在就是不存在。File.Exists(PathURL)

十七、Mac和IOS
由于对苹果系统不了解直接认为这俩是同一个东西,Mac在AB包打包时候需要选择目标平台StandaloneOSX而IOS则选择IOS,在路径上也要判断OSXEditor和OSXPlayer使用不同路径

十八、lua文件为什么不能打成AB包
需要将期后缀改为.bytes文件才可以打包。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小盖子

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值