自定义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;
        }
    }
}

我们开始测试使用,其主要完成对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的更多相关文章
- WinServer-服务器管理器-从入门到放弃
		WIN7 远程服务器管理工具 看看这篇帖子,他们说可以在WIN7上通过服务器管理工具来管理服务器上的软件 https://social.technet.microsoft.com/Forums/zh- ... 
- Django Managers管理器
		Managers class Manager 管理器是向Django模型提供数据库查询操作的接口.Django应用程序中每个模型至少有一个管理器. Manager names 默认情况下管理器的名字为 ... 
- with和上下文管理器
		with和上下文管理器 如果你有时间阅读源码的习惯,可能会看到一些优秀的代码会出现带有with关键字的语句. 对于系统资源如文件,数据库连接,socket而言,应用程序打开这些资源并执行完业务逻辑之后 ... 
- [2016-07-15]nuget包管理器控制台下的powershell脚本介绍
		博客有阵子没打理了,今天刚恢复样式,但是标题还是不太正常,总算能凑合看看. 回到正题,最近为了能在VS的程序包管理器控制台上能方便的自定义ps脚本去调整project的package,就开始看powe ... 
- [转帖]油猴脚本管理器 Tampermonkey v4.8 离线CRX安装包(谷歌浏览器版)
		https://www.52pojie.cn/thread-1010604-1-1.html 油猴脚本管理器 Tampermonkey v4.8 离线CRX安装包(谷歌浏览器版) 链接:https:/ ... 
- 一款备受欢迎的用户脚本管理器插件TampermonKey-油猴脚本管理器安装与使用
		Tampermonkey简介 Tampermonkey是一款备受欢迎的浏览器扩展和用户脚本管理器,它适用于目前各种主流浏览器. 方便的脚本管理(正在运行的脚本和可以运行的脚本在图标处显示一览无余) 脚 ... 
- nuget包管理器控制台下的powershell脚本介绍
		http://personball.com/powershell/2016/07/15/powershell-tips 定制自己的powershell,减少重复工作 安装一系列自己的常用nuget包 ... 
- [置顶] Android布局管理器 - 详细解析布局实现
		布局管理器都是以ViewGroup为基类派生出来的; 使用布局管理器可以适配不同手机屏幕的分辨率,尺寸大小; 布局管理器之间的继承关系 : 在上面的UML图中可以看出, 绝对布局 帧布局 网格布局 相 ... 
- python爬虫主要就是五个模块:爬虫启动入口模块,URL管理器存放已经爬虫的URL和待爬虫URL列表,html下载器,html解析器,html输出器      同时可以掌握到urllib2的使用、bs4(BeautifulSoup)页面解析器、re正则表达式、urlparse、python基础知识回顾(set集合操作)等相关内容。
		本次python爬虫百步百科,里面详细分析了爬虫的步骤,对每一步代码都有详细的注释说明,可通过本案例掌握python爬虫的特点: 1.爬虫调度入口(crawler_main.py) # coding: ... 
- 【Android 应用开发】AndroidUI设计之 布局管理器 - 详细解析布局实现
		写完博客的总结 : 以前没有弄清楚的概念清晰化 父容器与本容器属性 : android_layout...属性是本容器的属性, 定义在这个布局管理器的LayoutParams内部类中, 每个布局管理器 ... 
随机推荐
- KingbaseES 对象重命名需要注意的事项
			前言: Oracle 对视图或同义词依赖的底层对象表,如果被重命名,则视图或同义词失效.Oracle DBA 经常利用这个特点,对表进行重建,在重建过程中,无法通过视图或同义词访问,这就保证了数据的安 ... 
- Csharp线程
			CSharpe线程 目录 CSharpe线程 C#如何操作线程 Thread 1. Thread如何开启一个线程呢? 2. Thread中常见的API 3. thread的扩展封装 threadpoo ... 
- #虚树,树形dp#洛谷 4103 [HEOI2014]大工程
			题目 分析 建一棵虚树,然后树形dp,维护最长/短链和次长/短链, 对于第一个就是统计每条边有多少个点对经过就可以了 代码 #include <cstdio> #include <c ... 
- 使用 Debian、Docker 和 Nginx 部署 Web 应用
			前言 本文将介绍基于 Debian 的系统上使用 Docker 和 Nginx 进行 Web 应用部署的过程.着重介绍了 Debian.Docker 和 Nginx 的安装和配置. 第 1 步:更新和 ... 
- 在ECS上安装部署openGauss数据库指导手册
			在 ECS 上安装部署 openGauss 数据库指导手册 文档下载:在 ECS 上安装部署 openGauss 数据库指导手册.docx 前 言 简介 openGauss 是关系型数据库,采用客户端 ... 
- MindSpore编译构建后Vmap模块的RuntimeError问题
			技术背景 这篇文章来源于MindSpore仓库中的一个Issue,简单描述问题就是,如果你用MindSpore开发了一个python软件供别人使用,那么很有可能涉及到编译构建的问题.但是如果直接使用编 ... 
- HarmonyOS Codelab 优秀样例——购物应用,体验一次开发多端部署魅力
			一. 样例介绍 本篇Codelab基于自适应布局和响应式布局,实现购物应用在手机.折叠屏.平板不同屏幕尺寸设备上按不同设计显示.通过三层工程结构组织代码,实现一次开发,多端部署 . 手机运行效果如图所 ... 
- HarmonyOS Connect FAQ第四期
			原文:https://mp.weixin.qq.com/s/bvaV086QTnpnDFyYAVxQwQ,点击链接查看更多技术内容.在HarmonyOS Connect生态产品的认证测试环节,你是否存 ... 
- Python3中pip3命令的用法介绍及安装配置
			第一节:pip3是什么?有啥用? pip3:(Python3 Install Package ),这个英文全称是我为了更好的理解这个命令这么叫的,官方没有这对个命令的全称的解释:) python 支持 ... 
- centos 虚拟机修改mac和ip地址
			前言 因为网上过于零散,故而整理.在此我用的是vm虚拟机. 正文 在我们安装好vm虚拟机后,我们会获得两个虚拟网卡. 那么我们获得两个虚拟网卡后,这两个网卡到底是什么呢?那么我们打开vm的虚拟网络编辑 ... 
