什么是冷更新

开发者将测试好的代码,发布到应用商店的审核平台,平台方会进行稳定性及性能

测试。测试成功后,用户即可在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的更多相关文章

  1. Unity热更新 xLua

    xLua是Unity3D下Lua编程解决方案,自2016年初推广以来,已经应用于十多款腾讯自研游戏,因其良好性能.易用性.扩展性而广受好评.现在,腾讯已经将xLua开源到GitHub. 2016年12 ...

  2. 另类Unity热更新大法:代码注入式补丁热更新

    对老项目进行热更新 项目用纯C#开发的? 眼看Unity引擎热火朝天,无数程序猿加入到了Unity开发的大本营. 一些老项目,在当时ulua/slua还不如今天那样的成熟,因此他们选择了全c#开发:也 ...

  3. unity热更新方案对比

    Unity应用的iOS热更新 •  什么是热更新 •  为何要热更新 •  怎样在iOS 上对Unity 应用进行热更新 •  支持Unity iOS 热更新的各种Lua 插件的对照 什么是热更新 • ...

  4. Unity热更新对比

    https://www.jianshu.com/p/f9d90edf4a7c Unity 热更新为啥用Lua 详解 ILRuntime的优势 同市面上的其他热更方案相比,ILRuntime主要有以下优 ...

  5. Unity 热更新实例一、C#Light 和UI系统使用实例

    接下来我会运用热更新的机制,逐步制作一些例子来阐释脚本系统如何和Unity结合. 脚本不限于使用C#Lite,但是C#Lite会有一些便利之处,请往下看. 结合机制也不限于这一种,但是C#Lite的设 ...

  6. Unity热更新技术整理

    一.热更新学习介绍 1.什么是热更新 举例来说: 游戏上线后,玩家下载第一个版本(70M左右或者更大),在运营的过程中,如果需要更换UI显示,或者修改游戏的逻辑,这个时候,如果不使用热更新,就需要重新 ...

  7. 【转】unity 热更新思路和实现

    声明:本文介绍的热更新方案是我在网上搜索到的,然后自己修改了一下,相当于是借鉴了别人的思路,加工成了自己的,在此感谢无私分享经验的朋友们. 想要使用热更新技术,需要规划设计好资源比较策略,资源版本,确 ...

  8. [Unity热更新]tolua# & LuaFramework(一):基础

    一.tolua# c#调用lua:LuaState[变量名/函数名] 1.LuaState a.执行lua代码段 DoString(string) DoFile(.lua文件名) Require(.l ...

  9. Unity热更新 AssetBundle

    在游戏开发中,常常需要用到热更新技术.比如:一个手机游戏开发好后,用户安装到手机上.如果此时我们要更新一个新的功能,如果没有热更新,那么需要用户卸载掉手机上的游戏,然后安装新的包,这样做十分麻烦,而且 ...

  10. C#版的eval,C#Light开源嵌入式脚本,unity热更新不再愁

    目前最新版本AlphaV0.06 完全的c#语法,可用于一切能运行C#的场合,wp windows xamarin mono asp.net unity3d 内嵌了int uint bool stri ...

随机推荐

  1. 浅谈 web3

     web3--互联网的未来? web3,很多人觉得是个骗局,是在割韭菜.   因为大部分介绍 web3 的文章都离不开 NFT.数字货币.区块链.比特币.以太坊.元宇宙等概念,玄之又玄,脱离我们的生活 ...

  2. linux基本命令说明参数

    linux基本命令说明参数 标签(空格分隔): Linux 1.# 表示权限用户(如:root),$ 表示普通用户 开机提示:Login:输入用户名 password:输入口令 用户是系统注册用户成功 ...

  3. [Swift]Swift图片显示方式设置,控件UIImageView的contentMode属性设置

    contentMode属性是用来设置图片在UIImageView中的显示方式,如:拉伸.居中.填充等. 这里讨论的是UIImageView宽高固定,图片宽高不确定的情况.如社交APP的相册缩略图.手机 ...

  4. 路飞前台全局css 全局配置文件,安装axios,安装vue-cookies,安装elementui,安装bootstrap和jq,后台主页模块表设计,后台主页模块轮播图接口,录入数据,跨域问题详解

    目录 路飞前台全局css 全局配置文件,安装axios,安装vue-cookies,安装elementui,安装bootstrap和jq,后台主页模块表设计,后台主页模块轮播图接口,录入数据,跨域问题 ...

  5. Neural Network模型复杂度之Weight Decay - Python实现

    背景介绍Neural Network之模型复杂度主要取决于优化参数个数与参数变化范围. 优化参数个数可手动调节, 参数变化范围可通过正则化技术加以限制. 正则化技术之含义是: 引入额外的条件, 对fu ...

  6. Android学习——控件EditText

    1.主要属性

  7. 内存模型--共享、JMM

    Balking 指令重排

  8. springboot gradle 集成流程引擎activiti

    buildscript { repositories { maven { url 'https://maven.aliyun.com/repository/gradle-plugin' } } dep ...

  9. 1,docker遇到的问题1

    pushd "%~dp0"dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txtfor /f %% ...

  10. 服务器IPMI地址及用户名密码

    HP管理口:ILO默认用户/密码:Administrator/passwordHP以前管理口登陆MP卡通过网线连接MP卡的RJ-45口,通过telnet方式登录,默认用户/密码:Admin/Admin ...