Lua调用C#

目录

创建C#入口

Lua调用类

 Lua调用枚举

 Lua调用数组,列表,字典

 Lua调用C#拓展方法

Lua调用C#Ref与Out知识

Lua调用C#函数重载

Lua调用C#委托与事件

Lua调用C#二维数组

Lua调用C#中nil与null的差距

Lua调用C#中让系类型与lua能够互相访问

Lua调用C#协程

Lua调用C#泛型


创建C#入口

首先我们新建一个C#脚本,取名为Main,因为Lua中没有办法直接访问C#,一定是先从C#中调用lua再将核心逻辑让lua来编写

public class Main : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        LuaMgr.GetInstance().Init();
        LuaMgr.GetInstance().DoLuaFile("Main");
    }

}

Lua调用类

创建调用类的脚本,然后再Main的脚本中调用

require("Lesson1CallClass")

接着来编写调用类的lua脚本

print("----------------------Lua调用C#类相关知识---------------------")

--lua中使用C#的类
--固定格式:CS.命名空间.类名
--Unity的类 比如 GameObject Transform等—— CS.UnityEngine.类名
--CS.UnityEngine.GameObject

--通过C#中的类实例化一个对象
--lua中没有new,直接类名括括号就是实例化对象
--默认调用的,相当于就是无参构造
local obj1=CS.UnityEngine.GameObject()
local obj2=CS.UnityEngine.GameObject("xxx")

--为了方便使用与节约性能,定义全局变量存储C#的类
GameObject=CS.UnityEngine.GameObject
local obj3=GameObject("yyyyy")

--类中的静态对象可以直接使用.来调用
local obj4=GameObject.Find("xxx")

--得到其中的成员变量也是直接.对象
print(obj4.transform.position)
CS.UnityEngine.Debug.Log(obj4.transform.position)

--使用对象中的成员方法,要加:调用
Vector3=CS.UnityEngine.Vector3
obj4.transform:Translate(Vector3.right)
CS.UnityEngine.Debug.Log(obj4.transform.position)


运行出现为:1.场景中出现空物体 2.打印信息 3.位置坐标发生修改

 刚才调用的都是U3d中自带的类,现在我们尝试C#自定义类

public class Test
{
    public void Speak(string str)
    {
        Debug.Log("Test" + str);
    }
}

namespace tx
{
    public class Test2
    {
        public void Speak(string str)
        {
            Debug.Log("Test2"+str);
        }
    }
}
--调用没有在命名空间中的自定义类
local t1=CS.Test()
t1:Speak("11111111")

--调用在命名空间中的自定义类
local t2=CS.tx.Test2()
t2:Speak("2222222")

继承Mono的类:

--继承Mono的类,是不能直接new的
local obj5=GameObject("加脚本Test")
--通过GameObject的AddComponent添加脚本,由于lua中不支持无参泛型函数,我们使用另一个重载
--xlua提供一个方法typeof 得到类的type
obj5:AddComponent(typeof(CS.LuaCallCSharp))

运行可以看到

 Lua调用枚举

新建一个lua脚本在Main中调用,然后写

--枚举调用
--调用Unity中的枚举
--枚举调用规则与调用类相似:CS.命名空间.枚举名.枚举成员

PrimitiveType=CS.UnityEngine.PrimitiveType
GameObject=CS.UnityEngine.GameObject

local obj = GameObject.CreatePrimitive(PrimitiveType.Cube)

这样在场景中就会出现一个Cube

如果是自定义脚本,在C#中

public enum myem
{
    Idel,
    Move,
    Jump,
    Atk
}

然后在lua中我们调用并进行枚举的一系列转换,利用.__CastFrom(),可以看到

--自定义枚举
myem=CS.myem
local x=myem.Idel
print(x)

--枚举转换相关rgs
--数值转枚举
local a=myem.__CastFrom(1)
print(a)
--字符串转枚举
local b=myem.__CastFrom("Atk")
print(b)

 Lua调用数组,列表,字典

数组,列表,字典在lua中的使用都遵循C#的规则,我们先在C#中创建

    public int[]  arr=new int[5] { 1, 2, 3 ,7,6};

    public List<int> list=new List<int>();

    public Dictionary<int,string> dic = new Diction
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值