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的更多相关文章

  1. Coco2dx-3.0中怎样调用LUA

    一个用3.0的工具导出类到lua,自己主动生成代码的方法. 曾经要导出c++类到lua.就得手动维护pkg文件,那简直就是噩梦.3.0以后就会感觉生活非常轻松了. 以下我就在说下详细做法. 1.安装必 ...

  2. 深入xLua实现原理之C#如何调用Lua

    本文主要是探讨xLua下C#调用Lua的实现原理,有关Lua如何调用C#的介绍可以查看深入xLua实现原理之Lua如何调用C# C#与Lua数据通信机制 无论是Lua调用C#,还是C#调用Lua,都需 ...

  3. uLua学习之调用Lua函数(五)

    前言 在我开始这个系列的第一篇文章中,我就提到了Lua脚本用来实现宿主脚本的配置性和扩展性.上节说到的调用外部Lua脚本就对应了它的两大特性之一的配置性,那么另一大特性如何来体现呢?这就要说我们今天的 ...

  4. xLua中Lua调用C#

    xLua中Lua调用C# 1.前提 这里使用的是XLua框架,需要提前配置xlua,设置加载器路径: 可以参考之前的Blog:<xlua入门基础>: //调用段,所有的lua代码都写在Lu ...

  5. 【第二篇】xLua中lua加载方式

     xLua中lua文件加载方式 1. 直接执行字符串方式 LuaEnv luaenv = new LuaEnv(); luaenv.DoString("CS.UnityEngine.Debu ...

  6. xlua中lua对象到c#对象的转型

    lua中的类型 基础类型 #define LUA_TNIL 0 #define LUA_TBOOLEAN 1 #define LUA_TLIGHTUSERDATA 2 #define LUA_TNUM ...

  7. 深入xLua实现原理之Lua如何调用C#

    xLua是腾讯的一个开源项目,为Unity. .Net. Mono等C#环境增加Lua脚本编程的能力.本文主要是探讨xLua下Lua调用C#的实现原理. Lua与C#数据通信机制 无论是Lua调用C# ...

  8. vs如何在C++中调用Lua

    最近Cocos2dx的学习卡壳了,一般的照抄代码我不想写上来,但想示例也想得我头晕...为了放松大脑调整状态于是开始学习Lua.Lua的语法学习还是比较简单的,学过javascript或者vbscri ...

  9. vs2013如何在C++中调用Lua(二)

    Lua学习笔记 vs2013如何在C++中调用Lua (此为转载教程) 本人试过完全可行 一.准备工作 1.下载Lua源码,地址:http://www.lua.org/download.html(我用 ...

随机推荐

  1. mzy git学习,git协同开发忽略文档配置以及一些杂点(九)

    回忆一个电脑多账户问题 之前也说了,如果使用ssh登陆的话,一个电脑就只能登陆一个账号了,不像通过凭据可以切换(但是其实也可以每次去生成新的公钥和私钥,只要你不嫌麻烦) 再次补充: ssh-keyge ...

  2. JAVA 各种时间类型转换

    final Date date = new Date(); final Timestamp timestamp = new Timestamp(date.getTime()); final Calen ...

  3. AI 常见术语总结

      BN(Batch-normalization)在一层的输出上计算所有特征映射的均值和标准差,并且使用这些值规范化它们的响应.因此使得所有神经图(neural maps)在同样范围有响应,而且是零均 ...

  4. Python命名空间——locals()函数和globals()函数及局部赋值规则

    Python使用叫做命名空间的东西来记录变量的轨迹.命名空间只是一个 字典,它的键字就是变量名,字典的值就是那些变量的值.实际上,命名空间可以象Python的字典一样进行访问,一会我们就会看到. 在一 ...

  5. vue 根据身份证计算出出生日期和判断性别

    //获取生日和性别     getBirth(idCard) {              var birthday = "";       if(idCard != null & ...

  6. 操作系统的IO模型

    IO操作根据设备类型一般分为内存IO,网络IO,和磁盘IO.其中内存IO的速度大大快于后两者,计算机的性能瓶颈一般不在于内存IO. 尽管网络IO可通过购买独享带宽和高速网卡来提升速度,可以使用RAID ...

  7. MySQL——MySQL体系结构

    1.连接层 2.SQL层: (1)将接收到的SQL语句,解析成执行计划 (2)查询优化器 ---->选择最优的执行计划,交给存储引擎 (3)查询缓存: 缓存执行计划 (4)附加功能:权限. 语法 ...

  8. 20200713晚 noip14

    考场 很紧张,上午考太烂了 开场看到"影魔",想起以前看过(但没做),心态爆炸,咆哮时被 hkh diss 了 T1 一开始想建边跑最长路,每个点在记录一下 \(\min\{a\} ...

  9. python库--pandas--MultiIndex

    *表示后面会重复用到此参数 创建层次化索引 pd.MultiIndex 构造器 MI levels 每个级别不重复的标签 labels 每个级别的整数指定每个位置 *sortorder=None   ...

  10. Apache配置与应用

    目录: 一.基于域名的虚拟主机 二.基于IP地址的虚拟主机 三.基于端口的虚拟主机 四.Apache连接保持 五.构建Web虚拟目录与用户授权限制 六.Apache日志分割 七.AWStats 分析系 ...