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 正式发布,下一代前端构建工具!
133 0
|
16天前
|
开发框架 移动开发 前端开发
除了 HMR 插件,还有哪些技术可以实现热更新?
【10月更文挑战第23天】不同的热更新技术都有其特点和适用场景。开发者需要根据项目的具体需求和技术架构,选择合适的热更新技术来提高开发效率和用户体验。同时,随着技术的不断发展,热更新技术也在不断创新和完善,未来可能会出现更多更先进的热更新技术和方法。
|
3月前
|
缓存 前端开发 JavaScript
前端项目性能优化:使用vite的分包策略
【8月更文挑战第4天】Vite性能优化-分包策略
116 2
前端项目性能优化:使用vite的分包策略
|
4月前
|
Dart 开发工具 Android开发
快速集成 Flutter Shorebird 热更新
Flutter Shorebird 是一种云端代码推送服务,可以让开发者在几分钟内集成,无需修改代码即可将更新推送到任何 Dart 代码,支持所有 Android 和 iOS 设备,并符合 App Store 和 Play Store 的规定。Shorebird 最大的优点是无代码侵入,快速集成,设计优秀。
174 2
快速集成 Flutter Shorebird 热更新
|
6月前
|
资源调度 JavaScript 前端开发
Vite:下一代前端构建工具的快速上手
Vite 是由 Vue.js 的作者尤雨溪开发的下一代前端构建工具,它以其快速的冷启动、按需编译和热更新能力而受到广泛关注。Vite 通过利用浏览器原生的 ES 模块导入功能,提供了几乎即时的开发环境启动速度和高度优化的开发体验。
99 2
|
6月前
|
JavaScript 前端开发 IDE
TypeScript在前端项目的渐进式采用策略
该文介绍了渐进式采用TypeScript在前端项目中的策略。首先,通过将JS文件扩展名改为TS并添加类型注解,如在`utils.js`中添加类型。接着,配置`tsconfig.json`,包括目标版本、模块系统、输出目录等。高级配置涉及路径别名、JSON导入、库文件等。然后,集成TypeScript到构建流程,如Webpack,安装`ts-loader`并调整配置。利用类型定义,包括安装第三方库的类型定义包,自定义类型定义或使用社区定义。最后,逐步迁移其他模块至TypeScript,强化类型检查,并确保IDE支持。
45 0
|
6月前
|
资源调度 JavaScript 前端开发
深度剖析 Vite 配置
深度剖析 Vite 配置
236 1
|
12月前
|
前端开发 API 开发者
热更新原理
热更新原理
167 0
|
固态存储 程序员 C#
游戏热更新:游戏客户端热更新那点事
游戏热更新:游戏客户端热更新那点事
|
JavaScript 前端开发 API
Vite 热更新的主要流程
Vite 热更新的主要流程
337 0