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;
}

 

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM