Chinar 堅持將簡單的生活方式,帶給世人! (擁有更好的閱讀體驗 —— 高分辨率用戶請根據需求調整網頁縮放比例) |
記錄 Xlua 完成熱更新流程 為新手節省寶貴的時間,避免采坑! |
Chinar 教程效果:
1
Description —— 描述
Xlua 是騰訊出品的熱更新方案
由於其開源,且熱更新方案簡單易用,便於開發者對代碼進行維護與修改,而得到廣泛認可
這里 Chinar 對 Xlua 實現熱更新的流程與坑進行一些記錄與說明
2
Xlua Import and Open Hotfix —— Xlua導入項目並且開啟熱更新
導入 Xlua /到項目中后,我們需要在設置面板開啟熱更新才可以完全使用
輸入命令后,一定要回車,然后等待編譯!
3
Generate and Inject Scripts —— 生成與注入腳本文件
當工程中 Script /腳本文件有變更的時候
例如增加/刪除/增加標簽[Hotfix]/增加函數標簽[LuaCallCSharp]
注意:只要有任何變動,就需要重新生成和注入腳本
另外如果出現花式報錯時,就清除所有,並重新生成和注入
4
Custom LuaLoader —— 自定義Loader
為了測試在工程中調用 Lua 文件
新建一個腳本 ChinarHotFix ,並掛載當前場景
新建一個 Lua 文件放在一個目錄下(因為我們自定義的Loader,是要指定該目錄中的Lua文件的)
注意:
Lua文件的后綴名,要與函數中的 路徑后綴 保持一致
C# 文件:
using System.IO;
using System.Text;
using UnityEngine;
using XLua;
/// <summary>
/// 熱更新測試腳本——該腳本新建一個 Lua環境,並完成對 Lua腳本的指向調用
/// </summary>
public class ChinarHotFix : MonoBehaviour
{
private LuaEnv luaEnv; //聲明一個Lua環境對象
void Start()
{
luaEnv = new LuaEnv(); //實例化一個
luaEnv.AddLoader(ChinarLoader); //添加Loader
luaEnv.DoString("require'ChinarLuaTest'"); //引用名為: ChinarLuaTest 的 Lua 腳本
}
/// <summary>
/// 自定義一個 Loader
/// </summary>
/// <param name="luaFileName">Lua文件名</param>
/// <returns>字節組</returns>
private byte[] ChinarLoader(ref string luaFileName)
{
return Encoding.UTF8.GetBytes(File.ReadAllText(@"C:\Users\Administrator\Desktop\ChinarXLuaDemo\LuaFiles\" + luaFileName + ".lua")); //讀指定目錄下的 Lua 文件,並返回字節組
}
}
Lua 文件:
print('Chinar')
5
Before the LuaEnv.Dispose —— 釋放Lua環境之前
運行后需要對 LuaEnv 環境進行釋放
釋放 LuaEnv 之前還要反注冊,那些注冊到C#中的回調函數
不然就會造成 LuaEnv 已經釋放了,但是 Xlua 機制中的 Delegate 中的函數回調並沒有被釋放
直接新建一個 Lua 腳本,專門管理並釋放 Delegate 中的函數的釋放
例如:你通過Lua腳本 xlua.hotfix(CS.ChinarTest,'ChinarTestMethod',function)
注冊到 C# 中的函數
則通過新建一個 Lua 腳本ChinarDispose.lua
,寫上 xlua.hotfix(CS.ChinarTest,'ChinarTestMethod',nil)
質空,即可完成釋放
注意:每通過Lua腳本修改一個C#函數,都需要在ChinarDispose.lua
腳本中添加對應函數的釋放/刪除操作
更改后,可進行雙清、釋放的 C# 文件:
using System.IO;
using System.Text;
using UnityEngine;
using XLua;
/// <summary>
/// 熱更新測試腳本——該腳本新建一個 Lua環境,並完成對 Lua腳本的指向調用
/// </summary>
public class ChinarHotFix : MonoBehaviour
{
private LuaEnv luaEnv; //聲明一個Lua環境對象
void Start()
{
luaEnv = new LuaEnv(); //實例化一個
luaEnv.AddLoader(ChinarLoader); //添加Loader
luaEnv.DoString("require'ChinarLuaTest'"); //引用名為: ChinarLuaTest 的 Lua 腳本
}
/// <summary>
/// 自定義一個 Loader
/// </summary>
/// <param name="luaFileName">Lua文件名</param>
/// <returns>字節組</returns>
private byte[] ChinarLoader(ref string luaFileName)
{
return Encoding.UTF8.GetBytes(File.ReadAllText(@"C:\Users\Administrator\Desktop\XluaProjects\LuaFiles\" + luaFileName + ".lua")); //讀指定目錄下的 Lua 文件,並返回字節組
}
/// <summary>
/// 釋放掉函數
/// 此函數會在 OnDestroy 之前調用
/// </summary>
private void OnDisable()
{
luaEnv.DoString("require'ChinarDispose'");
}
/// <summary>
/// 釋放資源
/// 此函數會在最后調用,物體被刪除時
/// </summary>
private void OnDestroy()
{
luaEnv.Dispose();
}
}
ChinarDispose.lua文件:
xlua.hotfix(CS.ChinarTest,'ChinarTestMethod',nil)
--xlua.hotfix(CS.ChinarTest1,'ChinarTestMethod1',nil)只要有修改C#中對應函數,都需要在這里完成釋放操作 --xlua.hotfix(CS.ChinarTest2,'ChinarTestMethod2',nil) --xlua.hotfix(CS.ChinarTest3,'ChinarTestMethod3',nil)
6
private Variable —— 私有變量
正常情況,我們是無法直接通過 Lua 直接訪問到 C# 中的私有變量的
然而 Xlua 機制為我們提供了一個非常簡便的解決方案
當我們需要訪問某個 C# 類中的私有變量時,只需要在 Lua 代碼中加上一句話
xlua.private_accessible(CS.ChinarTest)
然后,我們就可以訪問到 C# ChinarTest
類中的私有變量了
更改后,可進行雙清、釋放的 C# 文件:
using UnityEngine;
using XLua;
[Hotfix]
public class ChinarTest: MonoBehaviour
{
private int Number = 666;//私有數字變量--例如這么一個私有變量
}
lua文件中加上:
xlua.private_accessible(CS.ChinarTest)--只有加上這句話,才可以訪問C#對應類中的私有變量
支持
May Be —— 搞開發,總有一天要做的事!
Chinar 提供一站式教程,閉眼式創建! 為新手節省寶貴時間,避免采坑! |
先點擊領取 —— 阿里全產品優惠券 (享受最低優惠)
1 —— 雲服務器超全購買流程 (新手必備!)
2 —— 阿里ECS雲服務器自定義配置 - 購買教程(新手必備!)
3—— Windows 服務器配置、運行、建站一條龍 !
4 —— Linux 服務器配置、運行、建站一條龍 !

技術交流群:806091680 ! Chinar 歡迎你的加入
本博客為非營利性個人原創,除部分有明確署名的作品外,所刊登的所有作品的著作權均為本人所擁有,本人保留所有法定權利。違者必究
對於需要復制、轉載、鏈接和傳播博客文章或內容的,請及時和本博主進行聯系,留言,Email: ichinar@icloud.com
對於經本博主明確授權和許可使用文章及內容的,使用時請注明文章或內容出處並注明網址