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

lua,v0 · 浏览次数 : 0

小编点评

## Custom Lua Parser Manager This code demonstrates a custom Lua parser manager using delegates and events for multi-return values and long parameter types. **Key Features:** * **Delegates:** * `CustomCallFunc` for calling functions with multiple return values. * `CustomCallParams` for calling functions with a single parameter of type `Object[]`. * **Custom Events:** * `OnFunctionStart` and `OnFunctionFinish` events are triggered when a function is started and finished executing, respectively. * **Multi-Return Values:** * Provides methods to access and manipulate multiple return values. * Uses `BeginPCall` and `EndPCall` for method calling with `out` parameters. * Supports passing an array of objects using `Push` and `PCall`. * Retrieves results through `CheckNumber`, `CheckBoolean`, etc. methods. * **Long Parameter Types:** * Supports passing long parameters using variable arguments. * Allows accessing and manipulating these parameters directly. **Implementation:** 1. **Initialize and Load Lua State:** * `CallLuaManager.Instance().Init()` initializes the manager. * `CallLuaManager.Instance().Require("Main")` loads the "Main.lua" script. 2. **Delegate Methods:** * `testFunc` and `testFunc1` demonstrate custom delegate usage for multi-return values. * `testFunc2` and `testFunc3` showcase using `CustomCallParams` for a single parameter and multiple parameters, respectively. 3. **Event Handling:** * `OnFunctionStart` and `OnFunctionFinish` events are triggered by the manager. * These events provide information about the function execution progress and results. 4. **Multi-Return Values:** * `testFunc2` demonstrates accessing and manipulating multiple return values. * These methods use `BeginPCall` and `EndPCall` for method invocation. * Similarly, `testFunc3` shows using variable arguments and `GetFunction` methods. 5. **Long Parameter Types:** * `testFunc3` allows passing long parameters using variable arguments. * These parameters are directly accessed and manipulated within the function. 6. **Event Subscription:** * Subscribe to `OnFunctionStart` and `OnFunctionFinish` events to react to function execution. **Additional Notes:** * The code assumes the existence of a `CallLuaManager.Instance()` singleton. * `OnApplicationQuit` is not implemented in this code. * The `Seting` script is not shown, but it should contain methods for setting custom delegates and event listeners. * This implementation provides a basic foundation for managing custom Lua parsers. **Further Enhancement:** * Implement event subscription for specific function calls. * Create a dedicated class for handling Lua functions. * Develop a more comprehensive logging mechanism. * Extend functionality with additional delegate and event methods.

正文

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

使用自定义委托来调用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中全局变量的访问修改和添加、以及多种函数类型的调用。

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

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

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

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

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

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

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

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

Springboot简单功能示例-4 自定义加密进行登录验证

博主尝试通过gitee的发行版,使用Springboot为基础框架,逐步整合JWT、JPA、VUE等常用功能项目。【本节完成】使用bcprov-jdk18on的sm2加密算法对用户密码进行签名及认证

[转帖]构建自定义镜像并优化dockerfile文件

https://www.cnblogs.com/renshengdezheli/p/16645144.html 目录 一.系统环境 二.前言 三.镜像构建步骤 四.dockerfile文件常用指令 4.1 dockerfile文件常用指令 4.2 RUN、CMD、ENTRYPOINT的区别 五.构建

4.5 x64dbg 探索钩子劫持技术

钩子劫持技术是计算机编程中的一种技术,它们可以让开发者拦截系统函数或应用程序函数的调用,并在函数调用前或调用后执行自定义代码,钩子劫持技术通常用于病毒和恶意软件,也可以让开发者扩展或修改系统函数的功能,从而提高软件的性能和增加新功能。钩子劫持技术的实现一般需要在对端内存中通过`create_alloc()`函数准备一块空间,并通过`assemble_write_memory()`函数,将一段汇编代

4.7 x64dbg 应用层的钩子扫描

所谓的应用层钩子(Application-level hooks)是一种编程技术,它允许应用程序通过在特定事件发生时执行特定代码来自定义或扩展其行为。这些事件可以是用户交互,系统事件,或者其他应用程序内部的事件。应用层钩子是在应用程序中添加自定义代码的一种灵活的方式。它们可以用于许多不同的用途,如安全审计、性能监视、访问控制和行为修改等。应用层钩子通常在应用程序的运行时被调用,可以执行一些预定义的

4.1 应用层Hook挂钩原理分析

InlineHook 是一种计算机安全编程技术,其原理是在计算机程序执行期间进行拦截、修改、增强现有函数功能。它使用钩子函数(也可以称为回调函数)来截获程序执行的各种事件,并在事件发生前或后进行自定义处理,从而控制或增强程序行为。Hook技术常被用于系统加速、功能增强、等领域。本章将重点讲解Hook是如何实现的,并手动封装实现自己的Hook挂钩模板。首先我们来探索一下Hook技术是如何实现的,如下

4.2 Inline Hook 挂钩技术

InlineHook 是一种计算机安全编程技术,其原理是在计算机程序执行期间进行拦截、修改、增强现有函数功能。它使用钩子函数(也可以称为回调函数)来截获程序执行的各种事件,并在事件发生前或后进行自定义处理,从而控制或增强程序行为。Hook技术常被用于系统加速、功能增强、开发等领域。本章将重点讲解Hook是如何实现的,并手动封装实现自己的Hook挂钩模板。

每日一题:通过css变量来控制主题

1、定义不同主题颜色 :root{ --theme-color: blue; --font-size: 18px;; } html[theme="dark"]{ --theme-color: #000; 2、通过切换html自定义属性来控制主题