我们编写的lua文件,是如何被加载使用的呢?大概有4种方式加载引用:
1)Inspector面板赋值
2)Resource文件夹加载,需要注意的是因为Resource只支持有限的后缀,放Resources下的lua文件得加上txt后缀
3) Require标签引入,相当于一个Loader加载器,lua文件默认在Resources文件夹下
4)自定义加载Loader,比如从服务器下载存放在本地某文件夹下的Lua文件
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;
using System.IO;
/*
* Author:W
* Lua文件加载方式
* 1)Inspector面板赋值
* 2)Resource文件夹加载,需要注意的是因为Resource只支持有限的后缀,放Resources下的lua文件得加上txt后缀
* 3) Require标签引入,相当于一个Loader加载器,lua文件默认在Resources文件夹下
* 4)自定义加载Loader,比如从服务器下载存放在本地某文件夹下的Lua文件
*/
public class LuaFileLoaderTest : MonoBehaviour {
private LuaEnv luaEnv;
/// <summary>
/// Inspector面板直接赋值
/// </summary>
public TextAsset luaFileByInspector;
void Awake()
{
luaEnv = new LuaEnv();
}
void Start()
{
ExcuteLuaCodeByInspector(luaFileByInspector);
ExcuteLuaCodeByResource("MyLua");
ExcuteLuaCodeByRequire("MyLua");
ExcuteLuaCodeByCustomLoader("MyLua2");
}
/// <summary>
/// Inspector面板赋值引用的Lua文件执行
/// </summary>
private void ExcuteLuaCodeByInspector(TextAsset luaAsset)
{
if (luaEnv == null|| luaAsset == null|| string.IsNullOrEmpty(luaAsset.text)) return;
luaEnv.DoString(luaAsset.text);
//调用Lua API
Action<string> logAct = luaEnv.Global.Get<Action<string>>("Log");
if (logAct != null)
logAct("ExcuteLuaCodeByInspector");
}
/// <summary>
/// Resource文件夹动态加载的Lua文件执行
/// </summary>
private void ExcuteLuaCodeByResource(string luaFile)
{
if (luaEnv == null) return;
TextAsset luaAsset = Resources.Load<TextAsset>(luaFile+".lua") ;
if (luaAsset == null || string.IsNullOrEmpty(luaAsset.text)) return;
luaEnv.DoString(luaAsset.text);
//调用Lua API
Action<string> logAct = luaEnv.Global.Get<Action<string>>("Log");
if (logAct != null)
logAct("ExcuteLuaCodeByResource");
}
/// <summary>
/// 通过require标签加载lua文件,相当于一个Loader加载器的作用
/// </summary>
/// <param name="luaFile"></param>
private void ExcuteLuaCodeByRequire(string luaFile)
{
if (luaEnv == null) return;
luaEnv.DoString("require \'"+luaFile+"\'");
//调用Lua API
Action<string> logAct = luaEnv.Global.Get<Action<string>>("Log");
if (logAct != null)
logAct("ExcuteLuaCodeByRequire");
}
/// <summary>
/// 执行自定义Lua的Loader加载器
/// </summary>
/// <param name="luaFile"></param>
private void ExcuteLuaCodeByCustomLoader(string luaFile)
{
if (luaEnv == null) return;
//自定义Loader
luaEnv.AddLoader(GenCustomLoader);
luaEnv.DoString("require \'" + luaFile + "\'");
//调用Lua API
Action<string> logAct = luaEnv.Global.Get<Action<string>>("Log");
if (logAct != null)
logAct("ExcuteLuaCodeByCustomLoader");
}
/// <summary>
/// 从本地文件目录下加载Lua文件
/// </summary>
/// <param name="luaFilePath"></param>
/// <returns></returns>
private byte[] GenCustomLoader(ref string luaFile)
{
byte[] loader = null;
string luaPath = Application.dataPath + "/LuaFiles/" + luaFile + ".lua.txt";
loader = System.Text.Encoding.UTF8.GetBytes(File.ReadAllText(luaPath));
return loader;
}
void OnDestroy()
{
if (luaEnv != null)
luaEnv.Dispose();
}
}
Resources文件夹下测试文件:MyLua.lua
function Log(info)
print("MyLua Log===="..info);
end
特定文件目录下的测试文件:MyLua2.lua
function Log(info)
print("MyLua2 Log===="..info);
end
测试运行结果如下图