U3D热更新技术

简介: U3D热更新技术

理论知识


冷更新及热更新


1、什么是冷更新


🕐:开发者将测试好的代码,发布到应用商店的审核平台,平台方会进行稳定性及性能测试。👉 测试成功后,用户即可在 👉 如苹果的AppStore看到应用的更新信息,用户点击应用更新后,需要先关闭应用,再进行更新。 👉 人话:重装


2、什么是热更新


🕐:什么是热更新❓

3.gif

🤷‍♂️广义:无需关闭应用,不停机状态下修复漏洞,指软件不通过运营商店的软件版本更新审核,直接通过应用自行下载的软件数据更新资源的行为,重点是更新逻辑代码。

🤷‍♂️狭义:( iOS热更新为例)👉 无需将代码重新打包提交至AppStore,即可更新客户端的执行代码,即不用下载App而自动更新程序。

🤷‍♂️现状:苹果禁止了C#的部分反射操作,禁止JIT(即时编译,程序运行时创建并运行新代码),不允许逻辑热更新,只允许使用AssetBundle进行资源热更新。


⚠ 注意:2017年6月1日,苹果更新了热更新政策说明,上线后的项目,一旦发现使用热更新,一样会以下架处理

3、为何要热更新


🧨缩短用户获取新版应用的客户端的流程,改善用户体验具体到iOS平台的应用上,有以下几个原因

  1. 1.AppStore的审核周期难控制 👉 需要5-7天时间甚至更久
  2. 2.手机应用更新频繁
  3. 3.对于大型应用,更新成本太大
  4. 4.终极目标 👉 不重新下载、不停机状态下完全变换一个应用的内容

4、不同平台的热更新技术


🔥 Android,PC(C#)

1.将执行代码预编译为AssemblyDLL

2.将代码作为TextAsset打包进AssetBundle

3.运行时调用AssemblyDLL代码

4.更新相应的AssetBundle即可实现热更新

🔥 iOS(Lua)

苹果官方禁止iOS下的程序热更新;JIT在iOS下无效热更新方案:Unity + Lua插件

image.png

5、常见的Unity热更新插件


  1. 1.sLua:最快的Lua插件
  2. 2.toLua:由uLua发展而来的,第三代Lua热更新方案
  3. 3.xLua:特性最先进的Lua插件
  4. 4.ILRuntime:纯C#实现的热更新插件

image.png

6、Lua的加载器规则


流程如👇

  1. 1.xLua的单例运行环境
  2. 2.xLua解析器创建销毁
  3. 3.xLua加载器编写
  4. 4.xLua中Lua调用C#代码
  5. 5.xLua中C#调用Lua代码

热更新Lua语法✔


image.png

基础思维导入如:

image.png

0、环境安装


环境搭载 👉 https://github.com/rjpcomputing/luaforwindows/

安装 👉 无脑下一步即可

Windows+R 👉 Lua 如👇(安装成功)

image.png

1、Lua面向对象


继承、封装、多态演示如 👇

--万物之父Object={}
print("====封装====")
functionObject:new()
localobj={} 
self.__index=selfsetmetatable(obj,self)
returnobjendprint("====继承====")
functionObject:SubClass( className )
_G[className]={}
localobj=_G[className]
obj.base=selfself.__index=selfsetmetatable(obj,self)
end--新的类Object:SubClass("Person")
Person.age=18Person.sex="男"functionPerson:Like()
self.age=self.age+1self.sex="男女不分"endlocalobj=Person:new()
print(obj.age)
print(obj:Like())
print(obj.age)
print(obj.sex)  
print("====多态====")
Person:SubClass("Player")
localobj=Player:new()
print(obj.age)
functionPlayer:Like()
self.base.Like(self)
self.age=self.age+100self.sex="女"endlocalX=Player:new()
print(X:Like())
print(X.age)
print(X.sex)

热更新AssetBundel✔


AssetBundel简称AB包孢子🍚🍚

image.png

基础思维导入如:

image.png

0、AB是什么


  1. 1.特定于平台的资产压缩包,有点类似压缩文件
  2. 2.资产包括:模型、贴图、预设体、音效、材质球等等

1、AB包思维导图


image.png

2、了解AB包有什么作用


相对Resources下的资源AB包更好管理资源

减小包体大小Resources和AB包区别

1、Resources(打包时定死只读无法修改)

2、AB包 👉 存储位置可自定义压缩方式自定义后期可以动态更新

3、减少初始包大小 如:下载游戏后再慢慢更新

热更新

1、资源热更新

2、脚本热更新

3、热更新基本规则

   客户端、自带很少默认资源、资源对比文件

   第一步→ 向服务器获取资源服务器地址

   第二步→ 通过资源对比文件,检查哪些要下载,下载AB包

   服务器 👉 资源服务器、资源对比文件、最新的各种AB包

3、生成AB包资源文件


image.png

4、UnityAB包


代码如👇

usingSystem.Collections;
usingUnityEngine;
publicclassAB : MonoBehaviour{
privatevoidStart()
    {
//同步加载===============//第一步 加载AB包AssetBundleab=AssetBundle.LoadFromFile(Application.streamingAssetsPath+"/"+"cube");
//第二部 加载AB包中的资源//GameObject obj = ab.LoadAsset<GameObject>("cube");GameObjectobj1=ab.LoadAsset("cube", typeof(GameObject)) asGameObject;
Instantiate(obj1);
//异步加载===============StartCoroutine(AsyLoadAB("aa", "Capsule"));
//卸载场景中的AB包===============AssetBundle.UnloadAllAssetBundles(false);
ab.Unload(false);
//当对象使用了不同包里面的资源的时候据需要加载对应的依赖包 才能正常===============//AssetBundle ab1 = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + "......");利用依赖包的关键知识点--利用主包获取依赖信息===============//AssetBundle ab1 = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + "StandaloneWindows");加载主包中的固定信息//AssetBundleManifest abMani = ab1.LoadAsset<AssetBundleManifest>("AssetBundleManifest");从主包文件中得到依赖信息//string[] strs=abMani.GetAllDependencies("......");得到依赖包的名字//print("Name");//AssetBundle ab2 = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + strs[1]);    }
IEnumeratorAsyLoadAB(stringABNamae, stringABNamae1)
    {
//第一步 加载AB包AssetBundleCreateRequestab=AssetBundle.LoadFromFileAsync(Application.streamingAssetsPath+"/"+ABNamae);
yieldreturnab;
//第二部 加载AB包中的资源AssetBundleRequestAB=ab.assetBundle.LoadAssetAsync(ABNamae1, typeof(GameObject));
yieldreturnAB;
Instantiate(AB.assetasGameObject);
    }
}

最后


image.png

下篇文章再见ヾ( ̄▽ ̄)ByeBye

image.png

相关文章
|
6月前
|
前端开发 JavaScript API
Vite 3.0 正式发布,下一代前端构建工具!
Vite 3.0 正式发布,下一代前端构建工具!
137 0
|
1月前
|
存储 前端开发 安全
Tauri 开发实践 — Tauri 原生能力
本文介绍了如何使用 Tauri 框架构建桌面应用,并详细解释了 Tauri 提供的原生能力,包括文件系统访问、系统托盘、本地消息通知等。文章通过一个具体的文件下载示例展示了如何配置 Tauri 来使用文件系统相关的原生能力,并提供了完整的代码实现。最后,文章还提供了 Github 源码链接,方便读者进一步学习和参考。
84 1
Tauri 开发实践 — Tauri 原生能力
|
26天前
|
开发框架 移动开发 前端开发
除了 HMR 插件,还有哪些技术可以实现热更新?
【10月更文挑战第23天】不同的热更新技术都有其特点和适用场景。开发者需要根据项目的具体需求和技术架构,选择合适的热更新技术来提高开发效率和用户体验。同时,随着技术的不断发展,热更新技术也在不断创新和完善,未来可能会出现更多更先进的热更新技术和方法。
|
28天前
|
前端开发 JavaScript 开发工具
Vite 4.0 发布,下一代的前端工具链
【10月更文挑战第21天】Vite 4.0 的发布标志着前端开发领域的又一次重要进步。它为开发者带来了更高效、更智能、更具创新性的开发体验,正逐渐成为下一代前端工具链的引领者。
|
3月前
|
缓存 前端开发 JavaScript
前端项目性能优化:使用vite的分包策略
【8月更文挑战第4天】Vite性能优化-分包策略
121 2
前端项目性能优化:使用vite的分包策略
|
4月前
|
Dart 开发工具 Android开发
快速集成 Flutter Shorebird 热更新
Flutter Shorebird 是一种云端代码推送服务,可以让开发者在几分钟内集成,无需修改代码即可将更新推送到任何 Dart 代码,支持所有 Android 和 iOS 设备,并符合 App Store 和 Play Store 的规定。Shorebird 最大的优点是无代码侵入,快速集成,设计优秀。
183 2
快速集成 Flutter Shorebird 热更新
|
前端开发 API 开发者
热更新原理
热更新原理
170 0
|
固态存储 程序员 C#
游戏热更新:游戏客户端热更新那点事
游戏热更新:游戏客户端热更新那点事
|
JavaScript 前端开发 API
Vite 热更新的主要流程
Vite 热更新的主要流程
344 0
|
JavaScript
热更新插件更新啦
热更新插件更新啦
159 0