如何评价腾讯在Unity下的xLua热更方案

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何评价腾讯在Unity下的xLua热更方案相关的知识,希望对你有一定的参考价值。

参考技术A 我认为xlua的概念很好,很多人用lua就是为了热更新,如果没有热更新的需求,大多数人是不喜欢lua,或者所谓的脚本开发的,xlua很好的解决了这部分人得需求。

但我有一点其他看法,我04年毕业在网易工作的时候,网易的游戏都是基于脚本的,不管是客户端,还是服务器端,那个时候不是lua,就是python,还有一种是类似c语法的脚本(我忘记名字了),这个是云风主导的,当时选择脚本作为逻辑开发语言的核心想法**不是为了热更新**,而是解决

1)划分引擎层和业务层,svn管理好权限,让新来的同学,接触不到核心引擎的代码权限,他们只能在脚本层做业务,等你对业务足够熟悉,对引擎足够了解,对公司足够忠诚后,才开放引擎层代码,这么做早年是为了解决私服问题,很多同学拿着全部源代码去架设私服,这多可怕,所以做业务的程序员只能拿到一个编译后的app和一份脚本接口文档,而编译出来的app会检查线上ip,报告非法服务器地址等,协助打击私服。

2)避免书写不好的c、cpp代码崩溃整个进程,脚本代码出错了,最多影响局部逻辑,还可以上报脚本错误,方便后续解决问题,现在unity里也一样,如果c#代码书写不好,就直接闪退了,不如用lua做一个安全的调用层。

3)快速修改代码,快速跑起来,早年cpp代码编译速度比较慢,修改一行代码调试运行等半天,脚本代码方便修改,方便跑起来,不用等,放到今天也一样,同时ios还有text size大小的限制,太多的stub function会撑大text size,而lua脚本再多的代码也不会有这个问题,不用再为了text size取舍代码怎么写,功能去留的问题。

4)反外挂,对,你没看错,反外挂,早年PE各种脱壳、反编译工具,使得一个exe几乎没有秘密,外挂作者很容易做外挂,而用脚本后,几乎所有逻辑都是中间代码,这部分中间代码可以通过修改opcode,加密,一边run,一边解密等技术,保证在进程空间内基本没有完成代码存在,对外挂作者是个很大挑战,所以网易的游戏反外挂历来做的都是最好的;

5)最后才是所谓的“热更新”, 当年也不是现在这种热更新,就是每次客户端启动的时候,有一个launcher去服务器下载一个update,然后应用这个update而已。

lua热更框架之XLua

框架介绍
xLua是当下最流行的unity热更方案之一,作者是腾讯的车雄生前辈,自2016年初推出以来,已经在腾讯的多款游戏项目上应用,目前xLua已经开源到了GitHub。xLua最大的特色是不仅支持纯lua脚本热更,更是可以做 C# 代码的bug hotfix,即平时开发时使用C#,项目上线后,如果突然发现有bug,可以直接用lua去修复出bug的地方,原理就是通过[Hotfix]特性标记然后在IL逻辑层判断修改逻辑,使程序去执行更新后的lua逻辑代码而不是走之前的C#逻辑。
 
框架优势
与别的lua热更插件不同的是,别的lua热更方案基本都是项目中需要热更的部分一开始就需要用lua语言去实现,xlua的HotFix出现之前,基本所有的lua热更方案都是如此,这样做的不足之处有:lua的性能是不如C#的,这是最主要的,此外,有些项目刚开始做时都是用C#的,如果已经用C#做完了,这时再去接入lua,把需要逻辑热更的C#代码重新用lua去实现,这样就麻烦了不少,费时费力,而且两种语言配合开发时还容易碰上伤脑筋的bug。使用xlua的HotFix,就可以平时开发用C#
,C#写起来比lua舒服多了吧;运行的时候也是C#,性能也比lua强;可能会出现bug或者需要热更逻辑的地方打上[HotFix]特性标签,然后就下载lua脚本文件更新实现即可,等到下次大版本更新时,再把lua补丁换成正确的C#实现。同时,xlua的易用性更是秒杀其他lua热更插件,在编辑器下无需生成代码,使用简单,不像其他lua热更插件每次更新代码就需要点Code Generate。
 
HotFix使用
xLua的纯lua热更使用方式跟其他lua热更方案大同小异,这里只简单介绍一下HotFix使用。
首先,对于可能出现bug或者后期需要更新逻辑的地方,给这个类加上[HotFix]标签,并在方法上打上[LuaCallCSharp]标签,例如下面这个类,打上[HotFix]标签,CreatePrize()方法上打上[LuaCallCSharp]标签,那么当需要更新这个方法时,只需在lua脚本中重新实现这个方法。

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using XLua;

[Hotfix]
public class Treasour : MonoBehaviour {
    public GameObject gold;
    public GameObject diamands;
    public Transform cavas;
    [LuaCallCSharp]
    private void CreatePrize()
    {
        for (int i = 0; i < 5; i++)
        {
            GameObject go = Instantiate(gold, transform.position + new Vector3(-10f + i * 30, 0, 0), transform.rotation);
            go.transform.SetParent(cavas);
            GameObject go1 = Instantiate(diamands, transform.position + new Vector3(0, 30, 0) + new Vector3(-10f + i * 30, 0, 0), transform.rotation);
            go1.transform.SetParent(cavas);
        }
    }
}

 

技术分享图片
在lua脚本中,如下:
local UnityEngine=CS.UnityEngine
xlua.hotfix(CS.Treasour,CreatePrize,function(self)
    for i=0,4,1 do
        local go=UnityEngine.GameObject.Instantiate(self.gold,self.transform.position+UnityEngine.Vector3(-10+i*40,0,0),self.transform.rotation)
        go.transform.SetParent(go.transform,self.cavas)
        local go1=UnityEngine.GameObject.Instantiate(self.diamands,self.transform.position+UnityEngine.Vector3(0,40,0)+UnityEngine.Vector3(-10+i*40,0,0),self.transform.rotation)
        go1.transform.SetParent(go1.transform,self.cavas)
    end
end)

 

技术分享图片
当客户端下载lua脚本后,就会自动执行lua中的CreatePrize方法,这样就实现了代码热更。
void Start(){ 
   if(_hotfix) 
        _lua_CreatePrize;  
   else  
        _csharp_CreatePrize;
}

 

 
技术分享图片
 

以上是关于如何评价腾讯在Unity下的xLua热更方案的主要内容,如果未能解决你的问题,请参考以下文章

如何评价腾讯在Unity下的xLua热更方案

如何评价腾讯在Unity下的xLua热更方案

lua热更框架之XLua

基于xlua和mvvm的unity框架

Unity使用Xlua框架热更

Unity 游戏用XLua的HotFix实现热更原理揭秘