跳转至

lua中使用C#的类相当简单 直接CS.命名空间.类名 Unity的类 比如 GameObject Transform等等 -- CS.UnityEngine.类名就可以

调用逻辑其实是: - Unity中写Lua - xlua帮我们处理

一 使用C#类

![[Pasted image 20250220230306.png]]

Lua的Main函数

require("test1")

test1.lua文件

lua中没有 new,所以我们直接 类名括号 就是实例化对象。 - 默认调用--等同于无参构造 - 传参,就是有参构造

local obj1 = CS.UnityEngine.GameObject()

local obj1 = CS.UnityEngine.GameObject(“测试”)

为了方便使用并节约性能,我们可以定义全局变量存储C#中的类

GameObject = CS.UnityEngine.GameObject
local obj3 = GameObject("111");

类中的静态对象

--类中的静态对象 可以直接使用.来调用

local obj4 = GameObject.Find("测试")

获得对象中的成员变量和静态方法

静态方法也可以直接用

print(obj4.transform.position)
Debug = CS.UnityEngine.Debug
Debug.Log(obj4.transform.position)

对象中的成员方法

冒号:的作用,可以把对象直接传进去,相当于

Vector3 = CS.UnityEngine.Vector3
obj4.transform:Translate()
            --相当于obj4.Tranlaste();

获取继承Mono的类

  • lua中==不支持带泛型的函数==,Unity提供了一个==含Type参数的Addcomponent方法==
  • xlua也提供了一个重要的方法叫做==typeof()==
local obj5 = GameObject("加脚本测试")
obj5::AddComponent(typeof(CS.LuaCallCSharp));

二.枚举

![[Pasted image 20250220230518.png]]

三.List Dictionary

![[Pasted image 20250220230701.png]]![[Pasted image 20250220230727.png]]

四 拓展方法(静态类)

![[Pasted image 20250220231759.png]]

五 Ref和out

Ref需要占位,out不需要 ![[Pasted image 20250220232138.png]]

混合使用

混合使用就是从左到右依次对应 ![[Pasted image 20250220232427.png]]

![[Pasted image 20250220231932.png]]

六 重载函数调用

![[Pasted image 20250220232720.png]] ![[Pasted image 20250220232534.png]]

七 委托和事件

调用委托

第一次往委托中加函数,因为是nil,不能直接+

![[Pasted image 20250220233752.png]]

![[Pasted image 20250220233905.png]]

调用事件

Lua的事件甲减函数 和 委托非常不一样 类似使用成员方法。 ![[Pasted image 20250220234154.png]]

九 二维数组遍历

![[Pasted image 20250220234253.png]]

十 null和nil比较

![[Pasted image 20250220234355.png]]

十 特殊问题

一 系统类型和Lua能相互访问

CSharpCallLua

  • 自定义委托:目的让Xlua识别这个是装函数的
  • 接口

LuaCallCSharp

  • 拓展方法时
  • 该特性建议每个被lua调用的类都加上,用来提升性能

无法为系统类和第三方库代码使用

  • 一定要是在静态类中
  • 一定要生成代码

静态类汇总:好处就是把所有特性汇聚在一起

十一 协程相关知识点

![[Pasted image 20250220235337.png]] ![[Pasted image 20250220235359.png]]

十二 泛型

![[Pasted image 20250220235451.png]]