什么是冷更新

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

测试。测试成功后,用户即可在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. java后台接收参数为枚举,postman的json如何传入

    使用postman测试接口,其中一个参数为枚举类型,如何传入参数? 1 枚举类型: public enum UserCourseOrderSourceType{ USER_BUY(1,"用户 ...

  2. c# 服务端接入个推指定对象消息推送

    个推消息推送主要步骤:1.获取鉴权token 2.发送推送消息 1.获取鉴权token(会过期,需要间隔时间获取一次): tokenUrl = "https://restapi.getui. ...

  3. 2023-03-02 TypeError: null is not an object (evaluating 'ImageCropPicker.openPicker')

    问题描述:rn项目使用到了一个插件react-native-image-crop-picker,运行后报错. 原因:安装该插件的时候没有link到android包里. 解决方案: react-nati ...

  4. css 实现 加载中动画效果

    上代码: <style> .pswp__preloader__icn { opacity:0.75; width: 24px; height: 24px; -webkit-animatio ...

  5. js中图片二进制和base64的互转

    <html> <head> <meta charset="UTF-8"> <title></title> </he ...

  6. Delphi 多进程共享内存的简单封装单元

    该单元转自武稀松的博客 稍作修改,使其支持Delphi7 { 共享内存封装. 封装成了MemoryStream的形式. 用法如下: var ms : TShareMemStream; ms := TS ...

  7. 关于htpasswd

    什么是 htpasswd htpasswd是一个apache的内置工具,其生成的文件称之为htpasswd文件.htpasswd文件本身一个密码本,或者类似于数据库一样,用来存储一些密码(凭证)信息. ...

  8. 设置App桌面图标上显示的角标数字

    设置应用图标上显示的数字 // #ifdef APP-PLUS plus.runtime.setBadgeNumber(number, options); plus.runtime.setBadgeN ...

  9. 微信小程序JS遇到【object object 】怎么打印?js如何打印object对象

    console.log(JSON.stringify(user)):或者打印的时候直接 console.log(user):不要出现'""'+这些符号

  10. uniapp全局黑白

    page{filter: grayscale(100%); } .uni-tabbar__item{filter: grayscale(100%); }