Unity 热更新XLua
什么是冷更新
开发者将测试好的代码,发布到应用商店的审核平台,平台方会进行稳定性及性能
测试。测试成功后,用户即可在AppStore看到应用的更新信息,用户点击应用更
新后,需要先关闭应用,再进行更新。
什么是热更新
广义:无需关闭应用,不停机状态下修复漏洞,更新资源等,重点是更新逻辑代码。
狭义定义( iOS热更新):无需将代码重新打包提交至AppStore,即可更新客户端
的执行代码,即不用下载app而自动更新程序。
现状:苹果禁止了C#的部分反射操作,禁止JIT(即时编译,程序运行时创建并运
行新代码),不允许逻辑热更新,只允许使用AssetBundle进行资源热更新。
注意:2017年,苹果更新了热更新政策说明,上线后的项目,一旦发现使用热更
新,一样会以下架处理
为何要热更新
缩短用户获取新版应用的客户端的流程,改善用户体验
具体到iOS平台的应用上,有以下几个原因
AppStore的审核周期难控制
手机应用更新频繁
对于大型应用,更新成本太大
终极目标
不重新下载、不停机状态下完全变换一个应用的内容
每个平台如何做热更新
Android,PC(C#)
将执行代码预编译为AssemblyDLL
将代码作为TextAsset打包进AssetBundle
运行时调用AssemblyDLL代码
更新相应的AssetBundle即可实现热更新
iOS(Lua)
苹果官方禁止iOS下的程序热更新;JIT在iOS下无效
热更新方案:Unity + Lua插件
常见的Unity热更新插件
sLua:最快的Lua插件
toLua:由uLua发展而来的,第三代Lua热更新方案
xLua:特性最先进的Lua插件
ILRuntime:纯C#实现的热更新插件
xLua的安装
官网:https://github.com/Tencent/xLua
将Assets目录下所有文件拷贝到项目中
xLua解析器的获得
DoString函数执行Lua代码
Lua代码调用C#代码
C#加载Lua文件
根据加载提示,发现可以将Lua文件放在StreamingAssets目录下
StreamingAssets被抛弃,所以移动到Resources下(以txt为结尾)
自定义加载器LuaEnv.AddLoader()
接触一个新的Lua项目时,先要弄懂Lua的加载器规则,只有这样,才能弄懂项目 的Lua执行流程
xLua的单例运行环境
xLua解析器创建销毁
xLua加载器编写
xLua中Lua调用C#代码
为什么?
C#实现的系统,因为Lua可以调用,所以完全可以换成Lua实现,因为Lua可
以即时更改,即时运行,所以游戏的代码逻辑就可以随时修改。
实现和C#相同效果的系统,如何实现?
Lua调用Unity的各种API,从而实现C#开发系统同样的效果
xLua中C#调用Lua代码
为什么?
Unity是基于C#语言开发的,所有生命周期函数都是基于C#实现,xLua本身
是不存在Unity的相关生命周期函数的。如果希望xLua能够拥有生命周期函
数,那么我们可以实现C#作为Unity原始调用,再使用C#调用Lua对应的方法。
xLua扩展学习(沈军老师博客)
https://shenjun-coder.github.io/LuaBook/%E7%AC%AC%E4%B8%89%E7%AB%A0%20XLua%E6%95%99%E7%A8%8B/
有两年多没用过Lua 了,今天复习下
在使用Lua的时候需要在Lua编写完成后后缀改为.txt
C# 调用Lua:
1.Lua代码放在Resoucrs文件夹下
luaEnv = new LuaEnv();
TextAsset luaText = Resources.Load<TextAsset("Lua/"+"Test.lua");
luaEnv.DoString(luaText.ToString());
2.放在任意文件夹下
string absPath = Application.streamingAssetsPath + "/" + filePath + ".lua.txt";
return (File.ReadAllText(absPath));
例如:用C#调用Lua代码实现物体的移动旋转
Lua
function move( ... )
H = CS.UnityEngine.Input.GetAxis("Horizontal")
V = CS.UnityEngine.Input.GetAxis("Vertical")
CS.UnityEngine.GameObject.Find("Cube").transform:Rotate(CS.UnityEngine.Vector3(0,H,0))
CS.UnityEngine.GameObject.Find("Cube").transform:Translate(CS.UnityEngine.Vector3(0,0,V))
end
C#
public class Test2 : MonoBehaviour
{
LuaEnv luaenv = null;
Action move;
private void Start()
{
luaenv = new LuaEnv();
TextAsset luaText = Resources.Load<TextAsset>("Lua/" + "GameObjectMove.lua");
luaenv.DoString(luaText.ToString()); move = luaenv.Global.Get<Action>("move");
} private void Update()
{ move();
}
}
Unity 热更新XLua的更多相关文章
- Unity热更新 xLua
xLua是Unity3D下Lua编程解决方案,自2016年初推广以来,已经应用于十多款腾讯自研游戏,因其良好性能.易用性.扩展性而广受好评.现在,腾讯已经将xLua开源到GitHub. 2016年12 ...
- 另类Unity热更新大法:代码注入式补丁热更新
对老项目进行热更新 项目用纯C#开发的? 眼看Unity引擎热火朝天,无数程序猿加入到了Unity开发的大本营. 一些老项目,在当时ulua/slua还不如今天那样的成熟,因此他们选择了全c#开发:也 ...
- unity热更新方案对比
Unity应用的iOS热更新 • 什么是热更新 • 为何要热更新 • 怎样在iOS 上对Unity 应用进行热更新 • 支持Unity iOS 热更新的各种Lua 插件的对照 什么是热更新 • ...
- Unity热更新对比
https://www.jianshu.com/p/f9d90edf4a7c Unity 热更新为啥用Lua 详解 ILRuntime的优势 同市面上的其他热更方案相比,ILRuntime主要有以下优 ...
- Unity 热更新实例一、C#Light 和UI系统使用实例
接下来我会运用热更新的机制,逐步制作一些例子来阐释脚本系统如何和Unity结合. 脚本不限于使用C#Lite,但是C#Lite会有一些便利之处,请往下看. 结合机制也不限于这一种,但是C#Lite的设 ...
- Unity热更新技术整理
一.热更新学习介绍 1.什么是热更新 举例来说: 游戏上线后,玩家下载第一个版本(70M左右或者更大),在运营的过程中,如果需要更换UI显示,或者修改游戏的逻辑,这个时候,如果不使用热更新,就需要重新 ...
- 【转】unity 热更新思路和实现
声明:本文介绍的热更新方案是我在网上搜索到的,然后自己修改了一下,相当于是借鉴了别人的思路,加工成了自己的,在此感谢无私分享经验的朋友们. 想要使用热更新技术,需要规划设计好资源比较策略,资源版本,确 ...
- [Unity热更新]tolua# & LuaFramework(一):基础
一.tolua# c#调用lua:LuaState[变量名/函数名] 1.LuaState a.执行lua代码段 DoString(string) DoFile(.lua文件名) Require(.l ...
- Unity热更新 AssetBundle
在游戏开发中,常常需要用到热更新技术.比如:一个手机游戏开发好后,用户安装到手机上.如果此时我们要更新一个新的功能,如果没有热更新,那么需要用户卸载掉手机上的游戏,然后安装新的包,这样做十分麻烦,而且 ...
- C#版的eval,C#Light开源嵌入式脚本,unity热更新不再愁
目前最新版本AlphaV0.06 完全的c#语法,可用于一切能运行C#的场合,wp windows xamarin mono asp.net unity3d 内嵌了int uint bool stri ...
随机推荐
- 均值、中值、高斯、non-local means算法详解
文章仅为个人理解,如有不妥之处欢迎指正. 写几个常见的图像去噪滤波器. 1.均值滤波器 均值滤波器是最简单的图像平滑滤波器,其3*3的模板为 1 9 [ 1 1 1 1 1 1 1 1 1 ] \fr ...
- Burp学院-信息泄露
1.Information disclosure in error messages错误消息中的信息泄露 GET /product?productId=1 发送到Repeater. 修改product ...
- 关于easyocr、paddleocr、cnocr之比较
关于easyocr.paddleocr.cnocr之比较 EasyOCR 是一个使用 Java 语言实现的 OCR 识别引擎(基于Tesseract).借助几个简单的API,即能使用Java语言完成图 ...
- snapshot备份
snapshot C: "h:\esd\$date_$hour_$minute_C.sna" -L0 -R -G snapshot64.exe C: "H:\ESD\$d ...
- 架构的生态系 资讯环境被如何设计至今.PDF
书本详情 架构的生态系 资讯环境被如何设计至今 作者: 濱野智史出版社: 大鴻藝術股份有限公司副标题: 資訊環境被如何設計至今?原作名: アーキテクチャの生態系――情報環境はいかに設計されてきたか译者 ...
- vue面试题及答案(1)
vue面试题,知识点汇总(有答案) 一. Vue 核心小知识点 1.vue 中 key 值的作用 key 的特殊属性主要用在 Vue 的虚拟 DOM 算法,在新旧 nodes 对比时辨识 VN ...
- vite实现element-plus按需配置,自定义主题和读取/修改系统主题色
项目地址 vite.config.ts 插件和vite配置 import { defineConfig } from "vite"; import vue from "@ ...
- 免费赠票 | Cloud Ace 受邀参加 GTC2022 全球流量大会,助力中国企业扬帆出海!
Cloud Ace 受邀参加 GTC2022 全球流量大会,助力中国企业扬帆出海! 大会将在 2023 年 2 月 28 日-3 月 1 日举行,地点就在福田会展中心 6 号展馆.大会门票实行收费 ...
- [转载]OpenCV中的channel是什么意思?
转载自https://answers.opencv.org/question/7585/meaning-of-channels/ 简单来说,就是描述一个pixel的颜色用多少个独立的参数描述,这个个数 ...
- C#消息泵探索(二)
引言: 上篇文章里简单的解释了C#的消息泵原理,这里我们以winform为例详细地了解一下实现代码. 底层实现 [DllImport(ExternDll.User32, ExactSpelling ...