什么是冷更新

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

测试。测试成功后,用户即可在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. JavaSE——==与.equal()方法

    ==号的作用 比较基本数据类型:比较的是具体的值 比较引用数据类型:比较的是对象地址值 package com.zhao.stringdemo; public class StringDemo2 { ...

  2. centos 换源

    原文: https://blog.csdn.net/MateSnake/article/details/124088310 备份原来的源:sudo mv /etc/yum.repos.d/CentOS ...

  3. 068_Apex&Page中的ReadOnly 使用方式

    一.page页面遇到需要检索大量数据的处理方式需要时会用Readonly 通常,对单个Visualforce页面请求的查询可能无法检索超过50,000行. 在Read only模式下,此限制将放宽允许 ...

  4. java读取apk、ipa包名、版本名、版本号等信息

    package com.gymexpress.exerciseservice.controller;import com.gymexpress.commonmodel.controller.BaseC ...

  5. Excel条件格式的应用

    一.突出单元格规则 大于/小于/等于/包含/发生日期/重复值 发生日期(自定义)通常通过辅助单元格进行:选中单元格区域,条件格式-新建规则-选择规则类型(使用公式确定要设置的单元格),设置内容如下 二 ...

  6. python菜鸟学习: 12. 装饰器的中级用法

    # -*- coding: utf-8 -*-username = "liyuzhoupan"password = "123"def author(wrappr ...

  7. (原创)odoo one2many字段以子列表形式显示

    模块详情

  8. (原创)odoo14下qweb模板的前端与后端语法区别

    1.后端(qweb打包) 后端使用t-inherit 指定继承的模板,使用t-inherit-mode 指定继承的模式,使用xpath定位标记,使用position指定扩展位置. 2.前端 前端仍旧使 ...

  9. Educational Codeforces Round 112 (Rated for Div

    Educational Codeforces Round 112 (Rated for Div. 2) CodeForces - 1555D Say No to Palindromes 如果一个字符串 ...

  10. [转]c#特性(Attribute)学习总结1

    特性是用于在运行时传递程序中各种元素(类.方法.结构.枚举.组件等)的行为信息的声明性标签. 官方的解读不好理解,举个常用的例子,平时会在类的上面加上[Serializable],Serializab ...