1.Unity学习笔记--基础2.Unity学习笔记--入门3.Unity学习笔记--数据持久化之PlayerPrefs的使用4.Unity学习笔记--数据持久化XML文件(1)5.Unity学习笔记--数据持久化XML文件(2)6.Unity学习笔记--数据持久化Json7.NGUI学习笔记(1)8.NGUI学习笔记29.NGUI学习笔记3.510.NGUI学习笔记4.011.Unity 热更--AssetBundle学习笔记 0.712.Unity 热更--AssetBundle学习笔记 0.813.Unity 热更--AssetBundle学习笔记 1.0【AB包资源加载工具类的实现】14.[2]自定义Lua解析方式15.Unity热更学习toLua使用--[1]toLua的导入和默认加载执行lua脚本
16.自定义Lua解析器管理器-------演化脚本V0.5
17.使用自定义委托来调用Lua中的多返回值和长参数类型函数18.使用自定义lua解析管理器调用lua脚本中的table19.Lua热更学习--使用toLua中的协程[3]自定义Lua解析器管理器-------演化脚本V0.5
方便我们在项目中使用Lua解析方法,我们封装管理一个lua解析器,管理LuaState的方法执行。
解析器脚本:
using LuaInterface;
namespace BaseFramework
{
///
/// 自定义的toLua解析器
///
public class CallLuaManager:SingletonAutoMono
{
private LuaState _luaState;
///
/// 供外部获取使用的属性
///
public LuaState LuaState
{
get
{
return _luaState;
}
}
public void Init()
{
_luaState = new LuaState();
_luaState.Start();
//初始化委托工厂
DelegateFactory.Init();
}
public void Require(string fileName)
{
_luaState.Require(fileName);
}
public void Dispose()
{
if(_luaState==null)
return;
_luaState.CheckTop();
_luaState.Dispose();
_luaState = null;
}
}
}

我们开始测试使用,其主要完成对Lua脚本中的全局变量的获取并赋值,Lua脚本中的无参无返回值函数调用、有参有返回值函数的四种方式调用,熟悉相关的API ,可以自行运行学习
using System;
using BaseFramework;
using LuaInterface;
using UnityEngine;
using UnityEngine.Events;
namespace CallLua
{
public class CallLuaEntrance:MonoBehaviour
{
private void Start()
{
CallLuaManager.Instance().Init();
CallLuaManager.Instance().Require("Main");
//获取全局变量
Debug.Log(CallLuaManager.Instance().LuaState["string1"]);
//无法获取lua脚本中的局部变量
CallLuaManager.Instance().LuaState["string1"] = "我被修改了!";
Debug.Log(CallLuaManager.Instance().LuaState["string1"]);
//可以理解LuaState中存储的所有全局变量列表
//如果有则可以查看并修改
//如果没有则新建
CallLuaManager.Instance().LuaState["newGloString"] = "我是新来的,是Lua全局变量";
//获取执行无参无返回值的lua函数
LuaFunction luaFunction = CallLuaManager.Instance().LuaState.GetFunction("testFunc");
luaFunction.Call();
luaFunction.Dispose();
//直接获取
luaFunction = CallLuaManager.Instance().LuaState["testFunc"] as LuaFunction;
luaFunction.Call();
luaFunction.Dispose();
//存入委托中再使用
luaFunction = CallLuaManager.Instance().LuaState.GetFunction("testFunc");
UnityAction action = luaFunction.ToDelegate();
action();
//-------------------------------------------------------------------------------------------------
//有参有返回值函数获取调用 方式1
luaFunction = CallLuaManager.Instance().LuaState.GetFunction("testFunc1");
luaFunction.BeginPCall();
luaFunction.Push(66);
luaFunction.PCall();
int res = (int)luaFunction.CheckNumber();
Debug.Log("参数为"+66+" ,返回值为"+res);
luaFunction.EndPCall();
//通过函数的Invoke方法来调用 方式2
//<参数类型,返回值类型>
res = luaFunction.Invoke(88);
Debug.Log("参数为"+88+" ,返回值为"+res);
//通过委托调用 方式3
Func func = luaFunction.ToDelegate>();
res = func(99);
Debug.Log("参数为"+99+" ,返回值为"+res);
//通过解析器直接调用 方式4 和2本质上是一样的掉用方式
res = CallLuaManager.Instance().LuaState.Invoke("testFunc1", 166, true);
Debug.Log("参数为"+166+" ,返回值为"+res);
CallLuaManager.Instance().Dispose();
}
}
}
其调用的lua测试脚本------Main.lua 放置在Lua文件夹下
--主入口函数。从这里开始lua逻辑
function Main()
print("logic start")
end
Main()
--场景切换通知
function OnLevelWasLoaded(level)
collectgarbage("collect")
Time.timeSinceLevelLoad = 0
end
--全局变量
string1 = "我是全局变量"
function testFunc()
print("无参无返回值函数调用成功!")
end
--有参数有返回值的函数
function testFunc1(a)
return a + 100
end
function OnApplicationQuit()
end