xLua中C#调用Lua
C#调用Lua
一.前提
这里使用的是XLua框架,需要提前配置xlua,设置加载器路径;
可以参考之前的Blog:《xlua入门基础》;
二.C#调用Lua全局变量
lua中所有的全局变量都会存在一个表中,对应xLua中的Global,通过lua解释器返回出来;
通过Global的方法Get<类型>(key)调用;
--Lua代码
num = 199
name = "littlePerilla"
hp = 2112.121
active = true
//c#代码
private void Start()
{
XluaEnv.I.DoString("CSharpCallVariable");
LuaTable golbal = XluaEnv.I.Golbal();
int id = golbal.Get<int>("num");
string name = golbal.Get<string>("name");
float hp = golbal.Get<float>("hp");
bool active = golbal.Get<bool>("active");
Debug.Log(id + "," + name + "," + hp + "," + active);
}
调用lua中局部变量,通过table调用;
三.C#调用Lua全局方法
调用lua中方法和调用变量方式相同,返回值为委托类型;
1.无参数方法
--Lua代码
func = function ()
print("lua函数")
end
Action act1 = golbal.Get<Action>("func");
act1();
2.带参数方法
--Lua代码
func2 = function(mName)
print(mName)
end
[CSharpCallLua]
public delegate void Func2(string name);
private void Start()
{
Func2 act3 = golbal.Get<Func2>("func2");
act3("littlePerilla");
}
3.多返回值
--Lua代码
func1 = function()
return 1,2,3
end
1)使用委托
[CSharpCallLua]
public delegate void Func(out int a, out int b, out int c);
private void Start()
{
Func act3 = golbal.Get<Func>("func1");
int a,b,c;
act3(out a,out b,out c);
}
2)使用LuaFunction
LuaFunction act2 = golbal.Get<LuaFunction>("func1");
object[] objs = act2.Call();
foreach (var obj in objs)
{
Debug.Log(obj);
}
坑:这里使用委托必须要加[CSharpCallLua]特性,但是有时候加了也会失效,可能是xlua版本和Unity版本兼容问题;
四.C#调用Lua表
Lua中的table相当于C#中的类,调用表也就是调用类;
--lua代码
tabe = {}
tabe.name = "littlePerilla"
tabe.hp = 100
tabe.attack = function (self)
return "展开了攻击"
end
tabe.jump = function(self)
self = tabe
print(self.name.."跳了起来")
end
通过Class映射
[CSharpCallLua]
public class Role
{
[CSharpCallLua]
public delegate string Func1();
[CSharpCallLua]
public delegate void Func2();
public string name;
public int hp;
public Func1 attack;
public Func2 jump;
}
public class CSharpCallTable:MonoBehaviour
{
private void Start()
{
XluaEnv.I.DoString("CSharpCallTable");
LuaTable global = XluaEnv.I.Golbal();
//通过table和c#中类映射来调用
Role core = global.Get<Role>("tabe");
core.name = "SuperPerilla";
Debug.Log(core.name+","+core.hp);
Debug.Log(core.attack());
core.jump();
}
}
通过LuaTable
public class CSharpCallTable:MonoBehaviour
{
private void Start()
{
XluaEnv.I.DoString("CSharpCallTable");
LuaTable global = XluaEnv.I.Golbal();
//通过C#中luatable类型调用
LuaTable core2 = global.Get<LuaTable>("tabe");
core2.Set<string, string>("name", "SuperPerilla");
Func<string> osp = core2.Get<Func<string>>("attack");
Debug.Log(osp());
Action jump = core2.Get<Action>("jump");
jump();
}
}
坑:这两个打印结果明显不同,通过类映射调用,修改类对象的字段后,再调用lua方法,方法中使用了该字段,发现字段值并没有改变,这应该是和lua中self的赋值有关系;
建议使用LuaTable来调用lua中的table;

xLua中C#调用Lua的更多相关文章
- Coco2dx-3.0中怎样调用LUA
一个用3.0的工具导出类到lua,自己主动生成代码的方法. 曾经要导出c++类到lua.就得手动维护pkg文件,那简直就是噩梦.3.0以后就会感觉生活非常轻松了. 以下我就在说下详细做法. 1.安装必 ...
- 深入xLua实现原理之C#如何调用Lua
本文主要是探讨xLua下C#调用Lua的实现原理,有关Lua如何调用C#的介绍可以查看深入xLua实现原理之Lua如何调用C# C#与Lua数据通信机制 无论是Lua调用C#,还是C#调用Lua,都需 ...
- uLua学习之调用Lua函数(五)
前言 在我开始这个系列的第一篇文章中,我就提到了Lua脚本用来实现宿主脚本的配置性和扩展性.上节说到的调用外部Lua脚本就对应了它的两大特性之一的配置性,那么另一大特性如何来体现呢?这就要说我们今天的 ...
- xLua中Lua调用C#
xLua中Lua调用C# 1.前提 这里使用的是XLua框架,需要提前配置xlua,设置加载器路径: 可以参考之前的Blog:<xlua入门基础>: //调用段,所有的lua代码都写在Lu ...
- 【第二篇】xLua中lua加载方式
xLua中lua文件加载方式 1. 直接执行字符串方式 LuaEnv luaenv = new LuaEnv(); luaenv.DoString("CS.UnityEngine.Debu ...
- xlua中lua对象到c#对象的转型
lua中的类型 基础类型 #define LUA_TNIL 0 #define LUA_TBOOLEAN 1 #define LUA_TLIGHTUSERDATA 2 #define LUA_TNUM ...
- 深入xLua实现原理之Lua如何调用C#
xLua是腾讯的一个开源项目,为Unity. .Net. Mono等C#环境增加Lua脚本编程的能力.本文主要是探讨xLua下Lua调用C#的实现原理. Lua与C#数据通信机制 无论是Lua调用C# ...
- vs如何在C++中调用Lua
最近Cocos2dx的学习卡壳了,一般的照抄代码我不想写上来,但想示例也想得我头晕...为了放松大脑调整状态于是开始学习Lua.Lua的语法学习还是比较简单的,学过javascript或者vbscri ...
- vs2013如何在C++中调用Lua(二)
Lua学习笔记 vs2013如何在C++中调用Lua (此为转载教程) 本人试过完全可行 一.准备工作 1.下载Lua源码,地址:http://www.lua.org/download.html(我用 ...
随机推荐
- springcloud starter(一)
Spring Cloud - Getting Started Example, 转载自:https://www.logicbig.com/tutorials/spring-framework/spri ...
- 算法入门 - 链表的实现及应用(Java版本)
之前我们学习了动态数组,虽然比原始数组的功能强大了不少,但还不是完全纯动态的(基于静态数组实现的).这回要讲的链表则是正儿八经的动态结构,是一种非常灵活的数据结构. 链表的基本结构 链表由一系列单一的 ...
- 写webpack插件报警告Tapable.plugin is deprecated. Use new API on .hooks instead解决方案,webpack4插件新写法
最近写了个小插件报了个警告,然后去百度了一下,全都给我说extract-text-webpack-plugin这个插件有问题要更新,我也是无语了,这个插件我用都没用,百度翻了下齐刷刷全是这个答案,搞得 ...
- 闭包 panic recover
闭包=函数+外层变量的引用 recover必须搭配defer使用 defer一定要在可能引发panic的语句之前定义
- go语言初始化结构体指针
go语言初始化结构体指针 head:=&ListNode{} 或者 head:=new(ListNode)
- redhat9 linux 网卡无法激活排障
先查看自己的系统版本! [root@localhost root]# uname -a Linux localhost 2.4.20-8 #1 Thu Mar 13 17:54:28 EST 2003 ...
- Python:MySQL拒绝从远程访问的解决方法
MySQL连接数据库 #!/usr/bin/python # -*- coding: UTF-8 -*- import pymysql # 打开数据库连接 db = pymysql.connect(& ...
- FPGA nios通过驱动LCD12864实现菜单界面和uart串口通信
因为csdn无法插入视频,无法展示我这个实现的效果,这里我截了一些图,应该基本上也能明白了: 基本功能就是如图片所示,里面采用了菜单结构(这里编程需要一定得c语言编程技巧与数据结构知识),gpa是什么 ...
- 从一个跨二十年的glibc bug说起
1. 缘起 这几天调gcc 7.5.0 +glibc 2.23的交叉编译工具链,由于gcc 7.5.0的默认打开Werr,偶然发现了glibc一个隐藏了二十年的世纪大bug. 这个bug在glibc ...
- Redis详解(三)——
redis https://www.cnblogs.com/zhangyinhua/p/14504717.html