xLua热更框架设计与制作

使用版本:Unity3D2019,
网络协议:Socket.TCP

以后的项目想使用热更,目前Unity3D比较好的热更框架为xLua,为此准备开始搞套xLua热更框架。

首先是到官网下载,打开后子文件按照README.md操作,将Assest拷贝复制项目中的Unity3D同级文件夹下。

随便建个脚本,在Start()中写下:

void Start()
    {
        XLua.LuaEnv luaenv = new XLua.LuaEnv();
        luaenv.DoString("CS.UnityEngine.Debug.Log('hello world')");
        luaenv.Dispose();
    }

拖到任意物体上,点击运行,结果显示“hello world”(这简直是个梗了)。

目前想法是:主项目用C#写,用lua脚本来做补丁,暂时还没什么思路。

今天先到这儿吧,以后再更。

============================2020.7.30============================

 

今天盯完上线的事情,接着啃框架部分,然后就找到了这篇博客

在官方包README.md文档中,提到了一些测试场景,它们的大致功能如下:

* [01_Helloworld](Assets/XLua/Examples/01_Helloworld/): 快速入门的例子。
* [02_U3DScripting](Assets/XLua/Examples/02_U3DScripting/): 展示怎么用lua来写MonoBehaviour。
* [03_UIEvent](Assets/XLua/Examples/03_UIEvent/): 展示怎么用lua来写UI逻辑。
* [04_LuaObjectOrented](Assets/XLua/Examples/04_LuaObjectOrented/): 展示lua面向对象和C#的配合。
* [05_NoGc](Assets/XLua/Examples/05_NoGc/): 展示怎么去避免值类型的GC。
* [06_Coroutine](Assets/XLua/Examples/06_Coroutine/): 展示lua协程怎么和Unity协程相配合。
* [07_AsyncTest](Assets/XLua/Examples/07_AsyncTest/): 展示怎么用lua协程来把异步逻辑同步化。
* [08_Hotfix](Assets/XLua/Examples/08_Hotfix/): 热补丁的示例(需要开启热补丁特性,如何开启请看[指南](Assets/XLua/Doc/hotfix.md))。
* [09_GenericMethod](Assets/XLua/Examples/09_GenericMethod/): 泛化函数支持的演示。
* [10_SignatureLoader](Assets/XLua/Examples/10_SignatureLoader/): 展示如何读取经数字签名的lua脚本,参见[数字签名](Assets/XLua/Doc/signature.md)的文档介绍。
* [11_RawObject](Assets/XLua/Examples/11_RawObject/): 当C#参数是object时,如何把一个lua number指定以boxing后的int传递过去。
* [12_ReImplementInLua](Assets/XLua/Examples/12_ReImplementInLua/): 展示如何将复杂值类型改为lua实现。

按照之前的预想,需要用的是热补丁,也就是场景8。按照博客中操作的时候,出现了一个错误please install the Tools(当然主要是我没按照博客的,去把Tools放到同名文件夹)。

这个错误的原因是路径不对,我们点进入脚本中,将代码修改为:

 var inject_tool_path = "./Tools/XLuaHotfixInject.exe";
            if (Application.platform == RuntimePlatform.WindowsEditor)
            {
                inject_tool_path = "E:/XLua/Tools/XLuaHotfixInject.exe"; //windows平台:改成本地路径            
            }

然后就是愉快的测试时间,按照博客中写的往下做就是。这里需要注意的是几个标签,具体在Assets\XLua\Doc\hotfix.md中有写,常用的为以下两个:

[Hotfix]//想修改的类前
[LuaCallCSharp]//想修改的方法前

在做场景测试的时候,使用了宏处理加载AB包,会自动把Resources下所有文件夹都加载,这里有点儿坑,还没想到特别好的处理办法。

 

另外这篇踩坑博客也有一定的参考价值。

============================2020.7.31============================

已经按照博客里面记录的方法,完成了热更,但现在遇到了两个问题:

1,安卓打包的时候报了个关于light的错误,把相关脚本删了就好了

2,安卓平台的下载与使用,具体思路:在启动界面先对比文件数量,然后传输AB包,最后启动LuEnv注入脚本

 

这几天热更方法大体测试没啥问题,但打包到安卓就运行不起来,找了些资料也不算对,后来发现降低版本可以解决(目前使用的是2019.4.4f),不过这个还有待确定。

============================2020.8.4============================

我们要做的是休闲游戏,所以会把一般资源打入安装包,而部分需要热更的逻辑与资源放到服务器

所以热更具体流程如下:

1,搭建提供下载文件的测试服务器,我用的是个叫 hfs的本地资源反正服务器

2,使用MD5打包AB包,这个最好放到单独的工程中

3,对比热更,执行补丁代码并、替换文件

============================2020.8.6============================

这几天遇到了很坑的问题,Unity3D2018没有问题,但在Unity2019以上版本,引入xlua后电脑运行正常,打包安卓一直会报错:o field __Hitfix0_

类似于这种:LuaException: xlua.access, no field __Hotfix0_OnCallBackTest

后来经过折腾,终于找到了问题所在:

## 标识要热更新的类型

和其它配置一样,有两种方式

方式一:直接在类里头打Hotfix标签(不建议,示例只是为了方便演示采取这种方式);

方式二:在一个static类的static字段或者属性里头配置一个列表。属性可以用于实现的比较复杂的配置,比如根据Namespace做白名单。

~~~csharp
//如果涉及到Assembly-CSharp.dll之外的其它dll,如下代码需要放到Editor目录
public static class HotfixCfg
{
    [Hotfix]
    public static List<Type> by_field = new List<Type>()
    {
        typeof(HotFixSubClass),
        typeof(GenericClass<>),
    };

    [Hotfix]
    public static List<Type> by_property
    {
        get
        {
            return (from type in Assembly.Load("Assembly-CSharp").GetTypes()
                    where type.Namespace == "XXXX"
                    select type).ToList();
        }
    }
}
~~~

我原来的就是使用第一种方式:

改成类似这样的就好了:

关于xlua标签使用的测试工程,我传到下载资源里面去了。

MD5效验和热更的代码也在测试工程内,是不是物超所值呢。

本系列先就更新到这儿,具体项目用的时候具体分析。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值