U3D热更新技术 | 您所在的位置:网站首页 › 热更新和冷更新哪个好 › U3D热更新技术 |
@作者 : SYFStrive @博客首页 : HomePage 📌:个人社区(欢迎大佬们加入) 👉:社区链接🔗 🤷♀️:创作不易转发需经作者同意😈 💃:程序员每天坚持锻炼💪 🕐:开发者将测试好的代码,发布到应用商店的审核平台,平台方会进行稳定性及性能测试。👉 测试成功后,用户即可在 👉 如苹果的AppStore看到应用的更新信息,用户点击应用更新后,需要先关闭应用,再进行更新。 👉 人话:重装 2、什么是热更新🕐:什么是热更新❓
⚠ 注意:2017年6月1日,苹果更新了热更新政策说明,上线后的项目,一旦发现使用热更新,一样会以下架处理 3、为何要热更新🧨缩短用户获取新版应用的客户端的流程,改善用户体验具体到iOS平台的应用上,有以下几个原因 AppStore的审核周期难控制 👉 需要5-7天时间甚至更久手机应用更新频繁对于大型应用,更新成本太大终极目标 👉 不重新下载、不停机状态下完全变换一个应用的内容 4、不同平台的热更新技术🔥 Android,PC(C#) 将执行代码预编译为AssemblyDLL将代码作为TextAsset打包进AssetBundle运行时调用AssemblyDLL代码更新相应的AssetBundle即可实现热更新🔥 iOS(Lua) 苹果官方禁止iOS下的程序热更新;JIT在iOS下无效热更新方案:Unity + Lua插件 流程如👇 xLua的单例运行环境xLua解析器创建销毁xLua加载器编写xLua中Lua调用C#代码xLua中C#调用Lua代码 热更新Lua语法✔基础思维导入如: 环境搭载 👉 https://github.com/rjpcomputing/luaforwindows/ 安装 👉 无脑下一步即可 Windows+R 👉 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) 热更新AssetBundel✔AssetBundel简称AB包孢子🍚🍚 基础思维导入如: 代码如👇 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 |
CopyRight 2018-2019 实验室设备网 版权所有 |