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

[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
posted @ 2024-05-08 08:05  畅知  阅读(272)  评论(0编辑  收藏  举报