xLua中Lua调用C#

1.前提

这里使用的是XLua框架,需要提前配置xlua,设置加载器路径;

可以参考之前的Blog:《xlua入门基础》

//调用段,所有的lua代码都写在LuaCallCSharp.lua文件中
public class LuaCallCSharp1 : MonoBehaviour
{
void Start()
{
XluaEnv.I.DoString("LuaCallCSharp");
} private void OnDestroy()
{
XluaEnv.I.Free();
}
}

2.调用C#类

静态类

public static class TestStatic
{
public static void ShowName(string name, int id)
{
Debug.Log($"name:{name},id:{id}");
}
}

--静态类
CS.TestStatic.ShowName("littlePerilla",1012);

动态类

public class NPC
{
public string name;
public int attack; public NPC(string name,int attack)
{
this.name = name;
this.attack = attack;
} public int Hp { get; set; } public void Attack()
{
Debug.Log($"attack:{attack},Hp:{Hp}");
}
}

--类对象
local hero = CS.NPC("Angel",100)
hero.Hp = 110
hero:Attack()

调用Unity官方Api

--创建物体
local go = CS.UnityEngine.GameObject("LuaObj ")
--添加组件
go:AddComponent(typeof(CS.UnityEngine.BoxCollider))

Lua不支持泛型,所有用到泛型的地方需要把每种可能的重载都写一遍;

调用父类和子类

public class Father
{
public string name = "father"; public virtual void Say()
{
Debug.Log($"{name}:我在被调用");
}
} public class Child :Father
{
public string name = "child"; public override void Say()
{
Debug.Log($"{name}:我在被调用");
}
}

local father = CS.Father()
father:Say() local child = CS.Child()
child:Say()

类拓展方法

拓展类必须为静态类,类必须加特性[LuaCallCSharp];《C#类拓展方法》;

会受到xlua版本和unity版本影响,导致调用失败,xlua官方推荐版本是2017(太过时了);

public class TestExtension
{
public string Test1()
{
return "test";
}
} [LuaCallCSharp]
public static class MyExtension
{
public static void Test2(this TestExtension obj)
{
Debug.Log("ExtensionFunc:"+ obj.Test1());
}
}

local testEx = CS.TestExtension()

print(testEx:Test1())
testEx:Test2()

3.调用C#结构体

结构体和类相似,都有构造方法;

public struct TestStruct
{
public int id;
public string name; public void Output()
{
Debug.Log(id);
Debug.Log(name);
}
}

--结构体
local teststrut = CS.TestStruct() teststrut.id = 12
teststrut.name = "littlePerilla" teststrut:Output()

4.调用C#枚举

枚举使用的userdate自定义数据类型;

public enum State
{
idle = 0,
walk,
run,
attack
}

--枚举使用的userdate自定义数据类型
local state = CS.State.idle print(state) --转换获得枚举
print(CS.State.__CastFrom(1))
print(CS.State.__CastFrom("run"))

5.调用C#中委托

静态委托赋值调用必须释放;

动态委托不必要,但是最好也释放;

调用委托前先做为空判定;

Lua中没有+=或-=方法,只能通过a = a+b来实现多播;

public delegate void DelegateLua();

public class TestDelegate
{
public static DelegateLua deStatic; public DelegateLua deDynamic; public static void Func()
{
Debug.Log("静态委托");
} public void Func2()
{
Debug.Log("动态委托");
}
}

--静态委托赋值调用必须释放
CS.TestDelegate.deStatic = CS.TestDelegate.Func
CS.TestDelegate.deStatic()
CS.TestDelegate.deStatic = nil local func = function ()
-- body
print("lua函数替换委托")
end --lua函数赋值委托
CS.TestDelegate.deStatic = func
--多播委托,确定deStatic不为空,lua没有+=和-=
if(CS.TestDelegate.deStatic ~= nil)then
CS.TestDelegate.deStatic = CS.TestDelegate.deStatic + func
else
CS.TestDelegate.deStatic = func
end --调用前判定不为空
if(CS.TestDelegate.deStatic ~= nil)then
CS.TestDelegate.deStatic()
end CS.TestDelegate.deStatic = nil
--动态委托
local test = CS.TestDelegate() local func1 = function()
print("动态委托调用")
end test.deDynamic = func1
test.deDynamic()
test.deDynamic = nil

6.调用C#事件

事件的调用不能直接复制,必须使用(“+”,function);

事件回调完成也需要释放;

public delegate void EventLua();

public class TestEvent
{
public event EventLua luaEvent1; public static event EventLua luaEvent2; public static void Func()
{
Debug.Log("静态事件");
} public static void CallEvent2()
{
if (luaEvent2 != null)
luaEvent2();
} public void CallEvent1()
{
if (luaEvent1 != null)
luaEvent1();
}
}

--静态事件
CS.TestEvent.luaEvent2("+",CS.TestEvent.Func)
CS.TestEvent.CallEvent2()
CS.TestEvent.luaEvent2("-",CS.TestEvent.Func) --动态事件
local test = CS.TestEvent() local func = function ()
print("动态事件")
end test:luaEvent1("+",func)
test:CallEvent1()
test:luaEvent1("-",func)

xLua中Lua调用C#的更多相关文章

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

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

  2. xLua中C#调用Lua

    C#调用Lua 一.前提 这里使用的是XLua框架,需要提前配置xlua,设置加载器路径: 可以参考之前的Blog:<xlua入门基础>: 二.C#调用Lua全局变量 lua中所有的全局变 ...

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

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

  4. FreeSWITCH IVR中lua调用并执行nodejs代码

    一.功能需求: 通过FreeSWITCH的IVR按键调用相应的脚本文件:nodejs提供很多的模组,可以方便的与其它系统或者进行任何形式的通讯,我的应用是通过nodejs发送http post请求: ...

  5. lua调用不同lua文件中的函数

    a.lua和b.lua在同一个目录下 a.lua调用b.lua中的test方法,注意b中test的写法 _M 和 a中调用方法: b.lua local _M = {}function _M.test ...

  6. xLua中导出Dotween

    前言 在xlua的lua脚本中使用dotween,官方的文档中有提到可以导出,但未介绍详细的步骤,相信比较多的朋友有需要,刚好项目中也在使用xlua和dotween,所以做个笔记. 基础知识: xLu ...

  7. Cocos2d-x下Lua调用自定义C++类和函数的最佳实践[转]

    Cocos2d-x下Lua调用C++这事之所以看起来这么复杂.网上所有的文档都没讲清楚,是因为存在5个层面的知识点: 1.在纯C环境下,把C函数注册进Lua环境,理解Lua和C之间可以互相调用的本质 ...

  8. Lua与C++交互初探之Lua调用C++

    Lua与C++交互初探之Lua调用C++ 上一篇我们已经成功将Lua的运行环境搭建了起来,也成功在C++里调用了Lua函数.今天我来讲解一下如何在Lua里调用C++函数. Lua作为一个轻量级脚本语言 ...

  9. 【转】Cocos2d-x下Lua调用自定义C++类和函数的最佳实践

    转自:http://segmentfault.com/blog/hongliang/1190000000631630 关于cocos2d-x下Lua调用C++的文档看了不少,但没有一篇真正把这事给讲明 ...

随机推荐

  1. Lambda Expressions and Functional Interfaces: Tips and Best Practices

    转载自https://www.baeldung.com/java-8-lambda-expressions-tips 1. Overview   Now that Java 8 has reached ...

  2. Linkerd 2.10(Step by Step)—配置重试

    Linkerd 2.10 系列 快速上手 Linkerd v2 Service Mesh(服务网格) 腾讯云 K8S 集群实战 Service Mesh-Linkerd2 & Traefik2 ...

  3. k8s笔记0528-基于KUBERNETES构建企业容器云手动部署集群记录-4

    部署kubelet 1.二进制包准备 将软件包从linux-node1复制到linux-node2中去. [root@linux-node1 ~]# cd /usr/local/src/kuberne ...

  4. 【Qt pro 文件配置】

    一.默认配置 默认的pro文件配置如下: 如果采用Qt默认的pro配置,其编译后产生的文件会默认集中分布在debug和release目录下,如下图的obj和moc等文件对后续打包发布并没有意义. 二. ...

  5. Mybatis笔记(1)

    一.Mabits简介 1.1 原始JDBC的分析 问题 ①数据库连接创建.释放频繁造成系统资源浪费从而影响系统性能 ②sql 语句在代码中硬编码,造成代码不易维护,实际应用 sql 变化的可能较大,s ...

  6. JavaWeb使用Filter进行字符编码过滤 预防web服务中文乱码

    JavaWeb使用Filter进行字符编码过滤 预防web服务中文乱码 准备条件:一个创建好的 JavaWeb 项目 步骤: 1.创建一个类并实现 Filter 接口 import javax.ser ...

  7. PXE预启动执行环境

    PXE(preboot execute environment,预启动执行环境)是由Intel公司开发的最新技术,工作于Client/Server的网络模式,支持工作站通过网络从远端服务器下载映像,并 ...

  8. 一文读懂Base64编码

    Base64编码 字符对应表 上表就是用来表示Base64,一共64个字符,A-Z,a-z,0-9,+,-,还有=(作为补位) 无论将文件,字符串,还是什么转为Base64,一定是用上表的字符表示. ...

  9. Appium自动化(8) - 可定位的控件属性

    如果你还想从头学起Appium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1693896.html 前言 在前面几篇文章可以看到,一个 ...

  10. VUE001. 拖动div盒子(自定义指令v-directives)

    拖动div是一个逻辑很简单的需求,监听容器的鼠标按下松开的事件,执行函数通过DOM改变标签的CSS偏移量. 在VUE构建的项目中,通过标签的 @mousedown 和 @mouseup 赋予行为事件, ...