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

相关文章
|
2月前
|
前端开发 JavaScript API
Vite 3.0 正式发布,下一代前端构建工具!
Vite 3.0 正式发布,下一代前端构建工具!
|
前端开发
在微前端qiankun中使用Vite你踩坑了吗?(下)
哈喽,我是树酱。之前搭建的微前端体系已经稳步运行将近两年了,最近遇到一些童鞋反馈。之前据说qiankun并不支持Vite打包的应用,那是不是我就无法使用了?
2866 0
在微前端qiankun中使用Vite你踩坑了吗?(下)
|
2月前
|
缓存 前端开发 JavaScript
Vite 打包优化:全面解析与实践
Vite 作为新一代前端构建工具,以其快速开发体验和高效打包能力著称。然而,在实际项目开发中,为了进一步提升性能和用户体验,我们仍需对 Vite 打包进行优化。本文将深入探讨 Vite 打包优化策略,涵盖代码拆分、资源压缩、缓存利用、构建配置等多个方面,并提供实践案例和最佳实践建议,帮助开发者充分释放 Vite 的潜力。
824 1
|
2月前
|
资源调度 JavaScript 前端开发
深度剖析 Vite 配置
深度剖析 Vite 配置
113 1
|
8月前
|
前端开发 API 开发者
热更新原理
热更新原理
128 0
|
8月前
|
固态存储 程序员 C#
游戏热更新:游戏客户端热更新那点事
游戏热更新:游戏客户端热更新那点事
|
JavaScript 前端开发 API
Vite 热更新的主要流程
Vite 热更新的主要流程
278 0
|
移动开发 JavaScript 前端开发
Vue脚手架热更新技术探秘
热替换(Hot Module Replacement)或热重载(Hot Reload)是指在不停机状态下,实时更新,在前端利于来说,在各大框架中及库中都有体现,比如NG从5开始就提供了热更新,RN也有对应的热更新技术,其实客户端技术很早就已经有这方面的探索,本文主要针对Vue脚手架的热更新
123 0
|
JavaScript
热更新插件更新啦
热更新插件更新啦
126 0
|
Web App开发 运维 前端开发
Vite + whistle:一劳永逸的开发环境代理方案
开发环境面临的跨域问题是每个开发者都会遇到的,有什么方法能“一劳永逸”呢?本文对比了多种方案,也植入到企业项目中进行尝试取得不错的效果,希望在跨域问题上能帮到你。
Vite + whistle:一劳永逸的开发环境代理方案