当前位置: 首页 > news >正文

Lua调用C#技术文档

1 Lua调用C#类

C#代码

using UnityEngine;public class Lesson1
{public static void Eat(){Debug.Log("Eat");}public void Speak(string str){Debug.Log(str);}
}

Lua代码

Lesson1 = CS.Lesson1--调用静态方法
Lesson1.Eat()--实例化对象
local obj = Lesson1()--调用成员方法
obj:Speak("Hello Lua")

知识补充

Lua 调用 C# 类的规则:

CS.命名空间.类名

注意:

  • 静态方法:. 调用
  • 成员方法:: 调用
  • Lua 没有 new,实例化直接 ClassName()

2 Lua调用C#枚举

C#代码

public enum E_MyEnum
{Idle = 0,Move = 1,Atk = 2
}

Lua代码

PrimitiveType = CS.UnityEngine.PrimitiveType
GameObject = CS.UnityEngine.GameObjectlocal obj = GameObject.CreatePrimitive(PrimitiveType.Cube)E_MyEnum = CS.E_MyEnumlocal a = E_MyEnum.Idle
print(a)local b = E_MyEnum.__CastFrom(1)
print(b)local c = E_MyEnum.__CastFrom("Atk")
print(c)

知识补充

枚举调用规则:

CS.命名空间.枚举.成员

枚举转换:

__CastFrom(数字)
__CastFrom(字符串)

3 Lua调用C#数组、List、Dictionary

C#代码

using System.Collections.Generic;public class Lesson3
{public int[] array = new int[] {1,2,3};public List<int> list = new List<int>();public Dictionary<int,string> dic = new Dictionary<int,string>();
}

Lua代码

local obj = CS.Lesson3()print(obj.array.Length)
print(obj.array[0])for i=0,obj.array.Length-1 doprint(obj.array[i])
endobj.list:Add(1)
obj.list:Add(2)print(obj.list.Count)for i=0,obj.list.Count-1 doprint(obj.list[i])
endobj.dic:Add(1,"123")for k,v in pairs(obj.dic) doprint(k,v)
end

知识补充

注意:

类型 长度
Array Length
List Count

Lua 索引从 1开始,但 C# 数组从 0开始


4 Lua调用C#拓展方法

C#代码

using UnityEngine;
using XLua;[LuaCallCSharp]
public static class Lesson4Extension
{public static void Move(this Lesson4 obj){Debug.Log("Move Extension");}
}public class Lesson4
{public static void Eat(){Debug.Log("Eat");}public void Speak(string str){Debug.Log(str);}
}

Lua代码

Lesson4 = CS.Lesson4Lesson4.Eat()local obj = Lesson4()obj:Speak("Hello")obj:Move()

知识补充

拓展方法必须:

[LuaCallCSharp]

Lua 调用方式:

obj:ExtensionMethod()

5 Lua调用C# ref / out

C#代码

public class Lesson5
{public int RefFun(int a, ref int b, ref int c){b = 10;c = 20;return a;}public int OutFun(int a, out int b){b = 50;return a;}
}

Lua代码

local obj = CS.Lesson5()local a,b,c = obj:RefFun(1,0,0)
print(a,b,c)local a,b = obj:OutFun(20)
print(a,b)

知识补充

返回规则:

第一个返回值:函数返回值
后面:ref/out参数

区别:

参数 是否需要占位
ref 需要
out 不需要

6 Lua调用C#函数重载

C#代码

public class Lesson6
{public int Calc(int a){return a;}public float Calc(float a){return a;}
}

Lua代码

local obj = CS.Lesson6()print(obj:Calc(10))
print(obj:Calc(10.2))

知识补充

Lua 只有一种数值类型:

Number

因此可能无法区分:

int
float
double

解决方法:

xlua.tofunction()

使用反射指定函数。


7 Lua调用C#委托和事件

C#代码

using System;public class Lesson7
{public Action del;public event Action eventAction;public void DoEvent(){eventAction?.Invoke();}public void ClearEvent(){eventAction = null;}
}

Lua代码

local obj = CS.Lesson7()local fun = function()print("Lua委托")
endobj.del = fun
obj.del = obj.del + funobj.del()obj.del = obj.del - funlocal fun2 = function()print("事件")
endobj:eventAction("+",fun2)obj:DoEvent()obj:eventAction("-",fun2)obj:ClearEvent()

知识补充

区别:

类型 操作
委托 = + -
事件 event("+",func)

8 Lua调用C#二维数组

C#代码

public class Lesson8
{public int[,] array ={{1,2,3},{4,5,6}};
}

Lua代码

local obj = CS.Lesson8()print(obj.array:GetLength(0))
print(obj.array:GetLength(1))print(obj.array:GetValue(0,0))for i=0,obj.array:GetLength(0)-1 dofor j=0,obj.array:GetLength(1)-1 doprint(obj.array:GetValue(i,j))end
end

知识补充

二维数组访问:

GetValue(i,j)

不能使用:

array[i][j]
array[i,j]

9 Lua判断C# null

C#代码

public class Lesson9
{
}

Lua代码

GameObject = CS.UnityEngine.GameObject
Rigidbody = CS.UnityEngine.Rigidbodylocal obj = GameObject("Test")local rig = obj:GetComponent(typeof(Rigidbody))if rig:IsNull() thenrig = obj:AddComponent(typeof(Rigidbody))
end

知识补充

Lua 的

nil

不等于 C# 的

null

推荐判断方式:

obj:IsNull()

10 Lua调用Unity UI事件

C#代码

无需额外脚本,使用 Unity UI。

需要在配置中:

[CSharpCallLua]
public static List<Type> CSharpCallLua = new List<Type>()
{typeof(UnityEngine.Events.UnityAction<float>)
};

Lua代码

GameObject = CS.UnityEngine.GameObject
UI = CS.UnityEngine.UIlocal slider = GameObject.Find("Slider")local sliderScript = slider:GetComponent(typeof(UI.Slider))sliderScript.onValueChanged:AddListener(function(f)print(f)
end)

知识补充

UI 事件本质:

UnityEvent

Lua 注册回调:

AddListener(luaFunc)

11 Lua调用C#协程

C#代码

using UnityEngine;public class CoroutineRunner : MonoBehaviour
{
}

Lua代码

util = require("xlua.util")GameObject = CS.UnityEngine.GameObject
WaitForSeconds = CS.UnityEngine.WaitForSecondslocal obj = GameObject("Coroutine")local mono = obj:AddComponent(typeof(CS.CoroutineRunner))fun = function()local a = 1while true docoroutine.yield(WaitForSeconds(1))print(a)a = a + 1if a > 10 thenmono:StopCoroutine(co)endend
endco = mono:StartCoroutine(util.cs_generator(fun))

知识补充

Lua 协程必须转换:

util.cs_generator(luaFunc)

Lua 使用:

coroutine.yield()

代替:

yield return

12 Lua调用C#泛型函数

C#代码

public class Lesson12
{public void TestFun1<T>(T a,T b){}public void TestFun2<T>(T a){}
}

Lua代码

local obj = CS.Lesson12()local testFun2 = xlua.get_generic_method(CS.Lesson12,"TestFun2")local testFun2_R = testFun2(CS.System.Int32)testFun2_R(obj,1)

知识补充

Lua 不能直接调用:

无参数泛型函数

解决方案:

xlua.get_generic_method()

步骤:

1 获取泛型函数
2 指定泛型类型
3 再调用函数


http://www.jsqmd.com/news/446408/

相关文章:

  • 2026年宁德地区美术联考教育机构靠谱的有哪些,费用怎么收 - 工业推荐榜
  • 微信立减金不会用?专业平台一键回收,安全又快速 - 可可收
  • 【深度解析】PC耐力板锁扣系统:无胶密封技术与实践应用 - 速递信息
  • C#委托经典习题代码解析
  • 口碑爆棚的宠物外科医院,2026年这些值得去,宠物皮肤科/宠物外科专家/狗狗体检/宠物内科专家,宠物外科专家最好的 - 品牌推荐师
  • 选择最佳加油卡回收平台:线上回收技巧助你快速变现 - 团团收购物卡回收
  • 终极 Nginx 配置指南(全网最详细)转
  • 哪家有实力的税务筹划品牌企业靠谱,杭州地区怎么选? - 工业设备
  • Luogu P3167 [CQOI2014] 通配符匹配 题解
  • 探寻2026年知名的跨境电商税务咨询企业,费用怎么算 - 工业品网
  • 2026年嘉兴口碑佳的无尘车间建设服务商推荐,无尘车间送回风系统原理说明 - 工业品网
  • C#委托习题代码解析
  • 讲讲2026年泽丰自动变速箱专修,可信任吗保养专业维修反馈排名揭秘 - 工业品牌热点
  • 2026年泽丰自动变速箱服务费用多少,黑龙江值得选购的品牌 - 工业品牌热点
  • 溶氧仪哪个品牌好用,价格大概多少钱 - myqiye
  • 镜面抛光液批发破局:振鸿兴SPD模型重构高价值供应链 - 速递信息
  • 2026年考研率高的工商类民办大学排名,湖北地区哪家口碑好 - myqiye
  • 2026年北京口碑好的全屋家具定制公司推荐,专业定制服务全解析 - mypinpai
  • 口碑不错的换电柜加盟公司有哪些,在杭州值得选择吗 - 工业品网
  • 探讨黑龙江靠谱的变速箱故障检测品牌制造商,泽丰费用多少 - 工业品牌热点
  • 解读美术联考教育机构收费情况,美术联考集训机构哪家靠谱 - 工业推荐榜
  • 对象,类,方法
  • 配眼镜选哪家性价比高,唐山市舒同视光科技有啥特色服务? - myqiye
  • 2026年广东耐用性镀膜表面处理厂家排名,靠谱品牌推荐 - mypinpai
  • 盘点2026年口碑好的专业防伪公司,助力企业防伪无忧 - 工业设备
  • 禾萌公社狗粮:在均衡框架中适配多样需求 - 品牌之家
  • 2026年优质的美术画室企业推荐,福州厦门靠谱品牌大盘点 - 工业推荐榜
  • 成都厕所防水补漏找哪家?业主实测 本地top3榜单 附避坑指南 - 宁夏壹山网络
  • 2026年印刷厂升级参考:不停机换单设备厂家口碑观察,市场不停机换单印刷机聚焦技术实力与行业适配性 - 品牌推荐师
  • 2026年2月聚焦:寻找好的冷却水塔定做厂家,闭式冷却塔/圆形逆流冷却塔/冷却水塔/冷却塔填料,冷却水塔制造厂哪家权威 - 品牌推荐师