自定义lua解析器管理器-kb88凯时官网登录

来自:
时间:2024-05-10
阅读:
免费资源网 - https://freexyz.cn/

方便我们在项目中使用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解析器管理器-------演化脚本v0.5

我们开始测试使用,其主要完成对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
免费资源网 - https://freexyz.cn/
返回顶部
顶部
网站地图