文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

U3D热更新技术

2023-08-20 19:12

关注

请添加图片描述

@作者 : SYFStrive

@博客首页 : HomePage

📌:个人社区(欢迎大佬们加入) 👉:社区链接🔗

🤷‍♀️:创作不易转发需经作者同意😈

💃:程序员每天坚持锻炼💪

请添加图片描述
在这里插入图片描述
相关专栏

👉 U3D热更新技术(🔥)

理论知识

  冷更新及热更新

     1、什么是冷更新

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

     2、什么是热更新

🕐:什么是热更新❓

请添加图片描述
🤷‍♂️广义:无需关闭应用,不停机状态下修复漏洞,指软件不通过运营商店的软件版本更新审核,直接通过应用自行下载的软件数据更新资源的行为,重点是更新逻辑代码。
🤷‍♂️狭义:( iOS热更新为例)👉 无需将代码重新打包提交至AppStore,即可更新客户端的执行代码,即不用下载App而自动更新程序。
🤷‍♂️现状:苹果禁止了C#的部分反射操作,禁止JIT(即时编译,程序运行时创建并运行新代码),不允许逻辑热更新,只允许使用AssetBundle进行资源热更新。

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

     3、为何要热更新

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

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

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

🔥 Android,PC(C#)

  1. 将执行代码预编译为AssemblyDLL
  2. 将代码作为TextAsset打包进AssetBundle
  3. 运行时调用AssemblyDLL代码
  4. 更新相应的AssetBundle即可实现热更新

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

请添加图片描述

     5、常见的Unity热更新插件

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

请添加图片描述

     6、Lua的加载器规则

流程如👇

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

  热更新Lua语法

基础思维导入如:在这里插入图片描述

请添加图片描述

     0、环境安装

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

安装 👉 无脑下一步即可
Windows+R 👉 Lua 如👇(安装成功)

在这里插入图片描述

     1、Lua面向对象

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

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

  热更新AssetBundel

AssetBundel简称AB包孢子🍚🍚

基础思维导入如:在这里插入图片描述

请添加图片描述

     0、AB是什么

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

     1、AB包思维导图

请添加图片描述

     2、了解AB包有什么作用

     3、生成AB包资源文件

在这里插入图片描述

     4、UnityAB包

代码如👇

using System.Collections;using UnityEngine;public class AB : MonoBehaviour{    private void Start()    {        //同步加载===============        //第一步 加载AB包        AssetBundle ab = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + "cube");        //第二部 加载AB包中的资源        //GameObject obj = ab.LoadAsset("cube");        GameObject obj1 = ab.LoadAsset("cube", typeof(GameObject)) as GameObject;        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");        从主包文件中 得到依赖信息        //string[] strs=abMani.GetAllDependencies("......");        得到依赖包的名字        //print("Name");        //AssetBundle ab2 = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + strs[1]);    }    IEnumerator AsyLoadAB(string ABNamae, string ABNamae1)    {        //第一步 加载AB包        AssetBundleCreateRequest ab =AssetBundle.LoadFromFileAsync(Application.streamingAssetsPath + "/" + ABNamae);        yield return ab;        //第二部 加载AB包中的资源        AssetBundleRequest AB= ab.assetBundle.LoadAssetAsync(ABNamae1, typeof(GameObject));        yield return AB;        Instantiate(AB.asset as GameObject);    }}

最后

在这里插入图片描述
本文到这里就结束了,大佬们的支持是我持续更新的最大动力,希望这篇文章能帮到大家💪

 

                 相关专栏连接🔗
在这里插入图片描述

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

在这里插入图片描述

来源地址:https://blog.csdn.net/m0_61490399/article/details/127458011

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯