Xlua更新

这里贴出官方的热更新教程~ 
https://github.com/Tencent/xLua/blob/master/Assets/XLua/Doc/hotfix.md
然后以下是本文大致的实现步骤: 
1. 这里使用AB包把需要修改的物体对象资源、要覆盖CS脚本的lua文件打包 
2. 客户端从服务器下载ab包,然后把新ab包缓存在本地,直到服务器下一次更新ab包 
3. 然后客户端用以前写好的CS脚本来从ab包获取lua文本,放到本地沙盒路径,然后再执行lua文本内容 
4. lua文本里可以继续从ab包缓存里获取其他资源,并对原CS脚本进行覆盖来修改bug

准备阶段,也就是正常的用C#编码阶段,也可以说是作预处理阶段,发布游戏之前,下次客户端更新之前。 
设置HotFix 
设置[LuaCallSharp] 
1. 在需要更新的类上加上[Hotfix] ,这个类需要提前预判,一般来说只更新UI部分,一般不更新物体,数据类 
2. 在可能更新的类方法中前[LuaCallCsharp] 
如:

[Hotfix]
public class BeHotFixA : MonoBehaviour {
    public int num1 = 100;
    private int num2 = 200;
    [LuaCallCSharp]
    void Update () {
        if (Input.GetMouseButtonDown (0)) {
            GameObject go = Resources.Load ("ObjA") as GameObject;
            Instantiate (go);
        }
    }
}

注意:这里第三步骤的脚本也是发布游戏之前写好的脚本

一、本地功能的逻辑实现

现在就进入处理阶段了,此时出现bug,需要做热更新了 
如下就是要替代C#的Lua代码,通过xlua.hotfix()方法

--第二次开发-》开始使用lua更新原工程内容
--BeHotFixA类的私有成员可以被访问
xlua.private_accessible(CS.BeHotFixA)
--替换CS中某个类的某个方法
xlua.hotfix(CS.BeHotFixA,"Update",function(self)
    print(num1,num2)
    local cs = CS.UnityEngine
    if cs.Input.GetMouseButtonDown(0) then
        local ab = cs.GameObject.Find("GameObject"):GetComponent("DownLoadAB").ab
        local obj = ab:LoadAsset("ObjB")
        local go = cs.GameObject.Instantiate(obj)
    end
end)

二、把资源进行打包

当发生bug,就需要把替代C#的lua文件,要更改的UI、材质等资源 
做成AssetBundle包

三、AB包放到服务器

第三步应该是提前准备阶段就做好的,因为这里是在本机测试,实际放到服务器,直接更改路径即可

public class DownLoadABB : MonoBehaviour {
    private string path = "file:///Users/neworigin/Desktop/YoungAB/ab";
    public AssetBundle ab;
    void Awake(){
        WWW www = WWW.LoadFromCacheOrDownload (path, 11);//三
        ab  = www.assetBundle;//四
        TextAsset hot = ab.LoadAsset ("hot.lua.txt") as TextAsset;
        Debug.Log (hot.text);//五
        string newPath = Application.persistentDataPath + "/hot.lua.txt";
        Debug.Log (newPath);
        //把AB里面的Hot脚本内容写入到沙盒路文件中
        File.WriteAllText(newPath,hot.text);//五、六
    }

四、下载新AB资源

使用WWW 下载AB包,然后获取ab包的资源(lua)和其他要覆盖资源

五、本地和服务器进行检测是否需要重新下载内容

执行游戏时,会默认调用原先做好的CS脚本,此时客户端就会从服务器获取文件,需要进行测试

六、执行下从服务器(AB包里)下载到本地的lua文件

此CS脚本需要在发布游戏前写好,做预处理。当出现问题时,就可以从(这里是沙盒路径)本地路径 
找到lua来执行。 这里的lua就是重新从服务器下载好的lua文本

public class HotFix : MonoBehaviour {
    void Awake(){
        LuaBehaviour.luaEnv.AddLoader (MyLoader);   
        LuaBehaviour.luaEnv.DoString ("require 'hot'");
    }

    public byte[] MyLoader(ref string filepath) {
        string path = Application.persistentDataPath + "/" + filepath + ".lua.txt";
        string str = File.ReadAllText (path);
        return System.Text.Encoding.UTF8.GetBytes (str);
    }
}

另外补充下对AddLoader 和 MyLoader 的理解

AddLoader()参数是方法名,这个方法的类型是被定义好的委托类型, 
filepath是DoString下的require ‘hot’ 的 hot 名 
此时就根据hot名配合沙盒路径找到那个lua文件 
lua文件被流读出来,用字符串的形式读出,最后返回出来全部内容 被DoString() 全部执行

DoString(“print(‘如这样的形式’)”) 

七、执行Lua更新内容、Lua中就是要hotfix来完成原CS中代码的替换

就是执行Xlua的Dostring,来执行新写好的lua文本内容

LuaBehaviour.luaEnv.DoString ("require 'hot'");
  •  

八、在下一次发布版本时,把Lua内容替换成CS内容

以上就热更新完成了,当下一次版本发布时,就把原来的lua文件覆盖的CS的bug重构修复即可

这里注意

每次Build 新的ab包后,服务器加载也要更新,因为有缓存,要设置新版本号来提示客户端重新下载 
如:WWW www = WWW.LoadFromCacheOrDownload (path, 11) 
且版本号要从小到大加的。 
每次CS脚本更新之后,就要重新生成GenerateXlua一下,然后点Hotfix injext in Enditor一下。才能播放测试。

Lua文本因为没有IDE提示,很容易写错(字符错误),建议在之前先用Resource.Load直接获取Lua文本(不build ab包,不从服务器下载) 直接获取lua内容来进行测试,直到lua文本不报错再换回来

## C#下Lua编程支持 xLua为Unity、 .Net、 Mono等C#环境增加Lua脚本编程的能力,借助xLua,这些Lua代码可以方便的和C#相互调用。 ## xLua的突破 xLua在功能、性能、易用性都有不少突破,这几方面分别最具代表性的是: * 可以运行时把C#实现(方法,操作符,属性,事件等等)替换成lua实现; * 出色的GC优化,自定义struct,枚举在Lua和C#间传递无C# gc alloc; * 编辑器下无需生成代码,开发更轻量; 更详细的特性、平台支持介绍请看[这里](Assets/XLua/Doc/features.md)。 ## 安装 打开zip包,你会看到一个Assets目录,这目录就对应Unity工程的Assets目录,保持这目录结构放到你的Unity工程。 如果希望安装到其它目录,请看[FAQ](Assets/XLua/Doc/faq.md)相关介绍。 ## 文档 * [常见问题解答](Assets/XLua/Doc/faq.md):常见问题都总结在这里,初使用大多数问题都可以在这里找到答案。 * (必看)[XLua教程](Assets/XLua/Doc/XLua教程.md):教程,其配套代码[这里](Assets/XLua/Tutorial/)。 * (必看)[XLua的配置](Assets/XLua/Doc/configure.md):介绍如何配置xLua。 * [热补丁操作指南](Assets/XLua/Doc/hotfix.md):介绍如何使用热补丁特性。 * [XLua增加删除第三方lua库](Assets/XLua/Doc/XLua增加删除第三方lua库.md):如何增删第三方lua扩展库。 * [XLua API](Assets/XLua/Doc/XLua_API.md):API文档。 * [生成引擎二次开发指南](Assets/XLua/Doc/custom_generate.md):介绍如何做生成引擎的二次开发。 ## 快速入门 一个完整的例子仅需3行代码: 安装好xLua,建一个MonoBehaviour拖到场景,在Start加入如下代码: ```csharp XLua.LuaEnv luaenv = new XLua.LuaEnv(); luaenv.DoString("CS.UnityEngine.Debug.Log('hello world')"); luaenv.Dispose(); ``` 1、DoString参数为string,可输入任意合法的Lua代码,本示例在lua里调用C#的UnityEngine.Debug.Log打印了个日志。 2、一个LuaEnv实例对应Lua虚拟机,出于开销的考虑,建议全局唯一。 C#主动调用lua也很简单,比如要调用lua的系统函数,推荐方式是: * 声明 ```csharp [XLua.CSharpCallLua] public delegate double LuaMax(double a, double b); ``` * 绑定 ```csharp var max = luaenv.Global.GetInPath("math.max"); ``` * 调用 ```csharp Debug.Log("max:" + max(32, 12)); ``` 建议绑定一次,重复使用。生成了代码的话,调用max是不产生gc alloc的。 ## 热补丁 * 侵入性小,老项目原有代码不做任何调整就可使用。 * 运行时影响小,不打补丁基本和原有程序一样。 * 出问题了可以用Lua来打补丁,这时才会走到lua代码逻辑; [这里](Assets/XLua/Doc/hotfix.md)是使用指南。 ## lua5.3 vs luajit xLua有两个版本,分别集成了lua5.3和luajit,一个项目只能选择其一。这两个版本C#代码是一样的,不同的是Plugins部分。 lua5.3的特性更丰富些,比如支持原生64位整数,支持苹果bitcode,支持utf8等。出现问题因为是纯c代码,也好定位。比起luajit,lua对安装包的影响也更小。 而luajit胜在性能,如果其jit不出问题的话,可以比lua高一个数量级。目前luajit作者不打算维护luajit,在找人接替其维护,后续发展不太明朗。 项目可以根据自己情况判断哪个更适合。因为目前lua53版本使用较多,所以xLua工程Plugins目录下默认配套是lua53版本。 ## 更多示例 * [01_Helloworld](Assets/XLua/Examples/01_Helloworld/):
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值