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

相关文章
|
运维 Ubuntu Linux
k8s-CKS真题-故障排查Sysdig & falco
k8s-CKS真题-故障排查Sysdig & falco
531 0
|
人工智能 C# C++
在 Visual Studio 上体验腾讯云 AI 代码助手
本文介绍如何在 Visual Studio 2022 中安装和使用腾讯云 AI 代码助手。首先,通过扩展管理器搜索并安装插件,重启 VS 完成安装。接着,在工具栏的“工具”中找到并启动助手,快捷键为 ALT + T。测试时输入问题如冒泡排序,助手会生成 C# 代码并可直接运行。建议优化默认代码语言为 C#、增加代码插入功能,并统一显示位置以提升用户体验。
1535 1
|
8月前
|
搜索推荐 算法
桶排序算法
桶排序是一种高效的排序算法,基于分治思想,理想时间复杂度为O(n)。它通过将数据分到多个桶中,每个桶再单独排序,最后按序合并各桶元素,从而实现整体有序。
623 0
|
安全 Linux 开发工具
零基础构建开源项目OpenIM桌面应用和pc web- Electron篇
OpenIM 为开发者提供开源即时通讯 SDK,作为 Twilio、Sendbird 等云服务的替代方案。借助 OpenIM,开发者可以构建安全可靠的即时通讯应用,如 WeChat、Zoom、Slack 等。 本仓库基于开源版 OpenIM SDK 开发,提供了一款基于 Electron 的即时通讯应用。您可以使用此应用程序作为 OpenIM SDK 的参考实现。本项目同时引用了 @openim/electron-client-sdk 和 @openim/wasm-client-sdk,分别为 Electron 版本和 Web 版本的 SDK,可以同时构建 PC Web 程序和桌面应用(Wi
1308 2
|
人工智能 自然语言处理 安全
千行百业,“义”不容辞:通义技术创新与商业实践
千行百业,“义”不容辞:通义技术创新与商业实践。本次分享分为两部分,首先介绍大模型的快速迭代与普及,探讨通义千问在精度和复杂任务执行上的突破;其次聚焦企业级落地,解决安全性、部署路径及模型调优三大问题。通过多模态理解(视觉、语音)和更强的生成控制力,携手伙伴服务各行业,推动技术向生产力转化,并关注公益应用,助力社会进步。
|
SQL 关系型数据库 MySQL
SQL中如何实现分页?
【8月更文挑战第3天】SQL中如何实现分页?
599 36
|
存储 SQL 测试技术
图书馆管理系统系统分析与设计(下)
图书馆管理系统系统分析与设计(下)
927 1
|
监控 安全 网络安全
网络信息安全之纵深防御
什么是“纵深防御”?很多人和资料都有不同的解释,有许多资料将“纵深防御”和“分层防护”等同起来, 上次文章介绍了“分层防护”,分层防护是根据网络的应用现状情况和网络的结构,将安全防范体系的层次划分为物理层安全、系统层安全、网络层安全、应用层安全和安全管理等各个层级,在每个层级实施相应的防护策略和手段。“纵深防御”与“分层防护”既有区别又有联系。
1513 0
网络信息安全之纵深防御
|
运维 前端开发 JavaScript
从单体结构到微服务架构的转变,微服务入门
从单体结构到微服务架构的转变,微服务入门
757 0
从单体结构到微服务架构的转变,微服务入门
|
人工智能 固态存储 关系型数据库
阿里云国际短信费用价格表
阿里云国际短信费用价格表,​​阿里云国际短信费用价格表,印度短信0.216元一条、中国香港短信0.33元一条、美国短信0.053元一条、日本短信0.514元一条、俄罗斯短信1.02元一条、印尼短信1.01元一条、意大利短信0.565元一条、伊朗短信0.592元一条,阿里云国际短信支持东南亚、欧洲、非洲、美洲等国家和地区
1943 0