• U3D热更新技术


    请添加图片描述

    @作者 : 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=self
    	setmetatable(obj,self)
    	return obj
    end
    
    print("====继承====")
    function Object:SubClass( className )
    	_G[className]={}
    	local  obj = _G[className]
    	obj.base=self
    	self.__index=self
    	setmetatable(obj,self)
    end
    
    --新的类
    Object:SubClass("Person")
    
    Person.age=18
    Person.sex="男"
    function Person:Like()
    	self.age=self.age+1
    	self.sex="男女不分"
    end
    
    local 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+100
    	self.sex="女"
    end
    
    local X = Player:new()
    print(X:Like())
    print(X.age)
    print(X.sex)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52

      热更新AssetBundel

    AssetBundel简称AB包孢子🍚🍚

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

    请添加图片描述

         0、AB是什么

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

         1、AB包思维导图

    请添加图片描述

         2、了解AB包有什么作用

    • 相对Resources下的资源AB包更好管理资源
    • 减小包体大小Resources和AB包区别
      1、Resources(打包时定死只读无法修改)
      2、AB包 👉 存储位置可自定义压缩方式自定义后期可以动态更新
      3、减少初始包大小 如:下载游戏后再慢慢更新
    • 热更新
      1、资源热更新
      2、脚本热更新
      3、热更新基本规则
          客户端、自带很少默认资源、资源对比文件
          第一步→ 向服务器获取资源服务器地址
          第二步→ 通过资源对比文件,检查哪些要下载,下载AB包
          服务器 👉 资源服务器、资源对比文件、最新的各种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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    最后

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

     

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

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

    在这里插入图片描述

  • 相关阅读:
    推荐一款企业管理专用低代码工具,实现开发系统自由!
    Java 性能优化实战案例分析:并行计算让代码“飞”起来
    Zabbix图形监控
    西南民族大学计算机考研资料汇总
    译译交友项目介绍
    关系型数据库的设计思想,20张图给你看的明明白白
    Visual Studio 错误CS0006:未能找到元数据文件踩坑记录
    毕设 仓库管理系统
    windows7 下WOW6432Node和dump文件生成问题
    40.讲初识动态规划:如何巧妙解决“双十一”购物时的凑单问题
  • 原文地址:https://blog.csdn.net/m0_61490399/article/details/127458011