自定义Lua解析器管理器-------演化脚本V0.5

lua,v0 · 浏览次数 : 5

小编点评

**解析器脚本 V0.5** **目的:**封装管理 Lua 解析器,管理 LuaState 方法执行。 **主要功能:** * 创建和初始化 LuaState 对象。 * 允许外部获取 LuaState。 * 提供各种方法以获取和设置全局变量和函数。 * 支持无参无返回值、有参有返回值和委托类型的调用。 **使用方法:** 1. 创建一个 `CallLuaManager` 对象。 2. 调用 `Init()` 方法初始化 LuaState。 3. 调用 `Require()` 方法加载 Lua脚本。 4. 调用 `LuaState.Invoke()` 方法执行 Lua 代码。 5. 调用 `Dispose()` 方法释放资源。 **示例:** ```lua -- main.lua function Main() callLuaManager.Instance().Init() callLuaManager.Instance().Require("main.lua") -- 获取全局变量 debug.log(callLuaManager.Instance().LuaState["string1"]) -- 设置局部变量 callLuaManager.Instance().LuaState["string1"] = "我被修改了!" -- 执行无参无返回值函数 callLuaManager.Instance().LuaState.Invoke("testFunc") -- 执行有参有返回值函数 res = callLuaManager.Instance().LuaState.Invoke("testFunc1", 66) debug.log("参数为", 66, " ,返回值为", res) -- 调用委托 callLuaManager.Instance().LuaState.Invoke("testFunc2", 88) end ``` **运行测试脚本:** 1. 创建一个新的 Unity 项目。 2. 创建一个新场景并添加 `CallLuaManager` 和 `CallLuaEntrance` 脚本。 3. 创建一个名为 `main.lua` 的 Lua 文件。 4. 将以下代码放入 `main.lua` 中: ```lua logic start function testFunc() print("无参无返回值函数调用成功!") end ``` 5. 运行游戏并检查输出日志。 **输出:** ``` logic start 逻辑 start 我被修改了! 参数为66 ,返回值为100 调用委托成功! ```

正文

[3]自定义Lua解析器管理器-------演化脚本V0.5

方便我们在项目中使用Lua解析方法,我们封装管理一个lua解析器,管理LuaState的方法执行。

解析器脚本:

using LuaInterface;

namespace BaseFramework
{
    /// <summary>
    /// 自定义的toLua解析器
    /// </summary>
    public class CallLuaManager:SingletonAutoMono<CallLuaManager>
    {
        private LuaState _luaState;
        /// <summary>
        /// 供外部获取使用的属性
        /// </summary>
        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;
        }
    }
}

image-20240508080302400

我们开始测试使用,其主要完成对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<UnityAction>();
            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<int, int>(88);
            Debug.Log("参数为"+88+" ,返回值为"+res);
            
            //通过委托调用              方式3
            Func<int, int> func = luaFunction.ToDelegate<Func<int, int>>();
            res = func(99);
            Debug.Log("参数为"+99+" ,返回值为"+res);
            
            //通过解析器直接调用          方式4  和2本质上是一样的掉用方式
            res = CallLuaManager.Instance().LuaState.Invoke<int, int>("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

与自定义Lua解析器管理器-------演化脚本V0.5相似的内容:

自定义Lua解析器管理器-------演化脚本V0.5

[3]自定义Lua解析器管理器 演化脚本V0.5 方便我们在项目中使用Lua解析方法,我们封装管理一个lua解析器,管理LuaState的方法执行。 解析器脚本: using LuaInterface; namespace BaseFramework { /// /// 自定义的

[4]自定义Lua解析器管理器-------演化脚本V0.7

使用自定义委托通过tolua来调用多返回值和长参数类型的函数。 防踩坑指南,使用自定义委托需要将委托类型添加到CustomSettings中。

使用自定义lua解析管理器调用lua脚本中的table

[5] 使用自定义lua解析管理器调用table 访问数组类型的table CallLuaEntrance测试脚本中内容: // 访问table //4.1 访问list/数组类型的table //获取table LuaTable luaTable = CallLuaManager.Instance

apisix~lua插件开发与插件注册

开发插件的步骤 在APISIX中,要自定义插件,一般需要按照以下步骤进行操作: 编写Lua脚本:首先,你需要编写Lua脚本来实现你想要的功能。可以根据APISIX提供的插件开发文档和示例进行编写。 将Lua脚本放置到APISIX插件目录:将编写好的Lua脚本文件放置到APISIX的插件目录下,一般是

apisix~自定义插件的部署

参考 https://docs.api7.ai/apisix/how-to-guide/custom-plugins/create-plugin-in-lua https://apisix.apache.org/docs/apisix/next/plugin-develop/ https://api

toLua中Lua调用C#中的类

toLua中Lua调用C#: [7]Lua脚本调用C#中的class 准备工作:打算在Lua脚本中使用Debug,使用lua调用C#脚本,需要绑定LuaState和自定义添加Debug Generated by EmmyLua(https://github.com/EmmyLua) Created

[转帖]Redis里使用Lua

http://me.52fhy.com/lua-book/chapter11.html 版本:自2.6.0起可用。 时间复杂度:取决于执行的脚本。 使用Lua脚本的好处: 减少网络开销。可以将多个请求通过脚本的形式一次发送,减少网络时延。 原子操作。redis会将整个脚本作为一个整体执行,中间不会被

[转帖]lua-book-函数

http://me.52fhy.com/lua-book/chapter5.html 在 Lua 中,函数 也是一种数据类型,函数可以存储在变量中,可以通过参数传递给其他函数,还可以作为其他函数的返回值。 函数定义 函数定义格式: function function_name (arc) -- ar

详解事务模式和Lua脚本,带你吃透Redis 事务

摘要:Redis事务包含两种模式:事务模式和Lua脚本。 本文分享自华为云社区《一文讲透 Redis 事务》,作者: 勇哥java实战分享。 准确的讲,Redis事务包含两种模式:事务模式和Lua脚本。 先说结论: Redis的事务模式具备如下特点: 保证隔离性; 无法保证持久性; 具备了一定的原子

手把手教你基于luatos的4G(LTE Cat.1)模组接入华为云物联网平台

摘要:本期文章采用了4G LTE Cat.1模块,编程语言用的是lua,实现对华为云物联网平台的设备通信与控制 本文分享自华为云社区《基于luatos的4G(LTE Cat.1)模组接入华为云物联网平台完成设备通信与控制(Air780e)》,作者:中华小能能。 一、简介 1、项目介绍 本期文章采用了