什么是冷更新

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

测试。测试成功后,用户即可在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中List的浅拷贝与深拷贝

    List浅拷贝 众所周知,list本质上是数组,而数组的是以地址的形式进行存储. 如上图将list A浅拷贝给list B,由于进行的是浅拷贝,所以直接将A的内容复制给了B,java中相同内容的数组指 ...

  2. Kubernetes 设置master相关

    设置master调度命令 1.设置master一般情况下不接受pod调度 sudo kubectl taint nodes master node-role.kubernetes.io/master= ...

  3. 升级版本后,报错go: -i flag is deprecated

    环境 go version go1.18.6 升级go版本后,本地项目起不来 将-i去掉 应用,在重启,则正常启动

  4. unixbench测试CPU性能工具

    UnixBench是一个类unix系(Unix,BSD,Linux)统下的性能测试工具,一个开源工具,被广泛用与测试linux系统主机的性能.Unixbench的主要测试项目有:系统调用.读写.进程. ...

  5. Hadoop环境的搭建

    Hadoop HDFS.Yarn.MapReduce Hadoop集群环境搭建 完全分布式环境,伪分布式将其中的多台服务器改为一台,并将配置文件中的相关内容更改即可 1.安装Linux系统模型机 关闭 ...

  6. [转]如何将本地项目上传至Gitee仓库(详细教程)

    码云(Gitee)简单介绍 Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放 ...

  7. CentOS7 设置防火墙、开放指定端口操作

    1, 查看防火墙状态: firewall-cmd --state systemctl status firewalld.service 2, 开启防火墙: systemctl start firewa ...

  8. Delphi 自定义窗体类名

    原理就是覆盖原CreateParams函数,重写新CreateParams函数,在新CreateParams函数继承完之后马上修改Parames.WinClassName type TForm1 = ...

  9. linux 创建 挂载 ntfs分区

    格式化为ntf分区 先用fdisk创建分区 格式化 mkfs.ntfs -f /dev/sda2 挂载 zxd@x79:~$ cat /etc/fstab# /etc/fstab: static fi ...

  10. 如何下载zoom上别人录制的视频?

    参考知乎作者"Oops chocoholic"的方法 https://www.zhihu.com/question/432030457/answer/1681898684 临时关闭 ...