首页 > 其他分享 >[4]自定义Lua解析器管理器-------演化脚本V0.7

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

时间:2024-05-09 21:45:58浏览次数:17  
标签:解析器 LuaState 管理器 自定义 int Instance luaFunction 返回值 CallLuaManager

使用自定义lua解析管理器调用函数

使用自定义委托来调用lua脚本中的多返回值函数和长参数类型的函数。

先看代码,依旧是上篇文章中所贴的脚本。新增调用两个函数testFunc

using System;
using BaseFramework;
using LuaInterface;
using UnityEngine;
using UnityEngine.Events;
using Object = System.Object;

namespace CallLua
{
    public class CallLuaEntrance:MonoBehaviour
    {
        //+ 委托
        public delegate int CustomCallFunc(int a, out int b, out int c, out string d, out bool e);
        public delegate void CustomCallParams(int a, params Object[] objects);
        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);
            
            //+ 新增内容
            //----------------------------多返回值函数----------------------------------------------------
            //001直接获取 执行结果 传统方式
            luaFunction = CallLuaManager.Instance().LuaState.GetFunction("testFunc2");
            luaFunction.BeginPCall();
            luaFunction.Push(566);
            luaFunction.PCall();
            int res1 = (int)luaFunction.CheckNumber();
            int res2 = (int)luaFunction.CheckNumber();
            int res3 = (int)luaFunction.CheckNumber();
            string res4 = luaFunction.CheckString();
            bool res5 = luaFunction.CheckBoolean();
            Debug.Log("多返回值函数数值结果--->"+res1+","+res2+","+res3+","+res4+","+res5);
            
            //002使用委托方式调用函数
            CustomCallFunc customCallFunc = luaFunction.ToDelegate<CustomCallFunc>();
            int b2, b3;
            string s2;
            bool bl;
            //注意 res接收第一个返回值 其它都按照out 变量赋值出
            int res0 = customCallFunc(788, out b2, out b3, out s2, out bl);
            Debug.Log("多返回值函数数值结果--->"+res0+","+b2+","+b3+","+","+s2+","+bl);
            
            //--------------------------------------------长参数函数调用--------------------------------
            luaFunction = CallLuaManager.Instance().LuaState.GetFunction("testFunc3");
            CustomCallParams customCallParams = luaFunction.ToDelegate<CustomCallParams>();
            customCallParams(1, 2, "tony", true, 666.66);
            
            //也可以直接调用 call用来调用void 类型函数
            luaFunction.Call<int,bool,float,string>(56,false,88.88f,"Chang");
            luaFunction.Call(98,365,false,88.88f,"Chang");//不给泛型也可以!

            CallLuaManager.Instance().Dispose();
        }
    }
}

注意!在tolua中使用自定义委托时候,需要在Seting脚本中添加自定义委托,之后再重新Generate一下。

image-20240509205251581

image-20240509205422368

要调用的Main.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 testFunc2(e)  
	print("多返回值函数执行")
	return e,e+100,e+200,"yes!",true
end
--变长参数函数
function testFunc3(a,...)  
	print("变长参数函数---")
	print(a)
	args = {...}
	for k,v in pairs(args) do
		print(k,v)
	end
end

function OnApplicationQuit()
	
end

好了,现在自定义的lua解析管理器已经完善对lua中全局变量的访问修改和添加、以及多种函数类型的调用。

先到这里了,接下来要接着完善管理器的功能,敬请期待!

标签:解析器,LuaState,管理器,自定义,int,Instance,luaFunction,返回值,CallLuaManager
From: https://www.cnblogs.com/TonyCode/p/18183121

相关文章

  • 瞬回丝滑!30秒解决win11文件管理器卡顿问题!
    命令文本:regadd"HKCU\Software\Classes\CLSID\{d93ed569-3b3e-4bff-8355-3c44f6a52bb5}\InprocServer32"/f/ve如需取消输入这个命令regdelete"HKCU\Software\Classes\CLSID\{d93ed569-3b3e-4bff-8355-3c44f6a52bb5}"/f 联想笔记本运行缓慢?别担心,我们为您提供了两种简......
  • 自定义上传图片到服务器出现了上传失败的问题
    1、上传路径没改动这里在上传的时候发现存入路径是windows版本的//读取原始文件名StringfileName=file.getOriginalFilename();//获取后缀名StringsuffixName=fileName.substring(fileName.lastIndexOf("."));......
  • Cysimdjson:地球上最快的 JSON 解析器
    处理简单的少量数据,对速度是无感的,但如果要处理大量数据,哪怕每次几十毫秒的差异,最终也会差异巨大。比如,你要为客户清洗一遍企业系统数据中,一堆之前留下的庞大的JSON文件。如果你打算用Python自带的JSON模块,那就调整好心态,备足咖啡,享受煎熬吧。但如果有人告诉你,有比Py......
  • 自定义协议通信协议实现简易群聊
    基础需求简易版聊天室,仅为演示自定义协议,所以只添加了登录登出功能。代码部分相当粗糙,很多场景没有进行细致考虑,仅展现了一个思路。首先进行一下基本流程分析服务端启动以后,监听某个地址和端口,接收新的客户端连接。连接建立以后,客户端发送登录请求,服务端进行校验并返回请......
  • 微信小程序使用微信云托管添加自定义域名并转发到pexels.com
    背景:我要在小程序上显示pexels.com上的图片,然后我得先把pexels.com的域名添加到小程序的request合法域名中,但是pexels.com是国外的,在国内没有备案所以添加不了。解决方案就是:用一个已经备案好的域名进行转发,转发的服务器我选择的是微信云托管,备案好的域名还需要ssl,没有的话本文会......
  • 自定义Behavior
    自定义Behavior实现功能在鼠标滚轮滚动时,ComboBox的SelectIndex也实现递增和递减CodepublicclassComboxMouseWheelBehavior:Behavior<ComboBox>{protectedoverridevoidOnAttached(){AssociatedObject.MouseWheel+=ComboxMouseWheel;}......
  • 自定义一个radio
    html<viewclass="radio-out":style="{'border-color':selectFlag?'blue':''}"><viewclass="radio-in":style="{'background-color':selectFlag?'blue':'......
  • mfc自定义控件的自动布局
    **CBRS_ALIGN_RIGHT是MFC(MicrosoftFoundationClass)中的一个标志,用于指示控件条可以停靠在框架窗口的客户区域右侧**。 在MFC中,窗口布局和控件的管理是一个重要的功能,尤其是在涉及到用户界面设计时。MFC提供了一套完整的机制来允许开发者创建和管理应用程序的界面,包括控......
  • C#多选下拉菜单自定义控件
    C#在winform项目中多选下拉菜单自定义控件。由 ComboBox和 CheckedListBox组合形成。效果: 自定义控件代码MultiComboBox.csusingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Drawing;usingSystem.Data;usingSystem......
  • C++基础-如何引入第三方静态库、动态库或自定义库 摘自 https://blog.csdn.net/u01310
    C++无论是内置库还是第三方库,都需要自己手动进行查找、配置、引入等工作。本文即是帮助完成C++项目对于库、框架如何完成依赖引入达成可调用的目的,重点讲述开发工具VisualStudio中的操作静态库(.lib)静态库引入适用用于大部分无开源的第三方库,开发者不需要关心库的具体实现如何,......