使用版本: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效验和热更的代码也在测试工程内,是不是物超所值呢。
本系列先就更新到这儿,具体项目用的时候具体分析。