lua调用C#

本文详细介绍了如何在Unity环境中使用Lua调用C#的各种元素,包括类、枚举、数组、List、Dictionary、拓展方法、ref和out参数、函数重载、委托和事件、二维数组、nil和null比较以及协程和泛型函数。通过这些实例,读者将能够深入理解Lua与C#之间的交互机制。
摘要由CSDN通过智能技术生成

一、lua调用类

在进行lua调用C#之前:Lua需要用Require(lua脚本名字)调用lua脚本 ,c#脚本里面也要调用这个lua脚本(Main脚本)

--固定套路写法
--CS.命名空间.类名
--Unity的类  比如  GameObject Transform等等   --- CS.UnityEngine.类名

--通过C#中的类  实例化一个对象  lua中没有new 所以我们直接 类名括号就是实例化对象
--默认调用的  相当于无参构造
local GameObject = CS.UnityEngine.GameObject("新创建出来的")

--为了方便使用并且节约性能  定义全局变量存储一个类  相当于取了一个别名
GameObject = CS.UnityEngine.GameObject

--类中的静态对象可以直接使用.来调用
local obj = GameObject.Find("Main Camera")
print(obj)
--得到对象中的成员变量 直接.即可
print(obj.transform.position)

--得到对象中的成员方法 一定要加:
Vector3 = CS.UnityEngine.Vector3
obj.transform:Translate(Vector3.right)
print(obj.transform.position)

--调用自定义类
--没有命名空间的
local t = CS.Test()
t:Speak("yu")
--有命名空间的
local t1 = CS.yu.Test2()
t1:Speak("yu")

--给一个对象添加脚本
--继承了Mono的类  是不能直接new
local obj2 = GameObject("加脚本的对象")
obj2:AddComponent(typeof(CS.LuaCallCSharp))

--总结:
--Lua调用C#的类  CS.命名空间.类名 例如:CS.UnityEngine.类名
--没有命名空间的也就是自己写的类   CS.类名  例如:CS.Test

--实例化一个对象  CS.命名空间.类名()
--静态方法和变量  CS.命名空间.类名.方法或者变量

--成员变量和成员方法  实例化对象.变量名   实例化对象:方法名

--技巧知识点(重点)
--1、可以取别名  别名 = CS.命名空间.类名(方便使用、节约性能)
--2、xLua不支持无参泛型函数  所以我们要使用AddComponent(Type)  xLua提供了一个typeof方法  可以得到对象的Type
public class Test
{
   
    public void Speak(string str)
    {
   
        Debug.Log("Test" + str);

    }
}

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

二、lua调用枚举(Enum)

--枚举的调用规则和类的调用规则是一样的
--CS.命名空间.枚举名.枚举成员
--也支持取别名
PrimitiveType = CS.UnityEngine.PrimitiveType
GameObject = CS.UnityEngine.GameObject

local obj = GameObject.CreatePrimitive(PrimitiveType.Cube)

--自定义枚举  使用方法一样  只是注意命名空间即可
E_MyEnum = CS.E_MyEnum

local idel = E_MyEnum.idel
print(idel)

--枚举的转换
--数值转枚举
local a = E_MyEnum.__CastFrom(1)
print(a)
--枚举转数值
local b = E_MyEnum.__CastFrom("Atk")
print(b)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;


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

    }
}

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

public enum E_MyEnum
{
   
    idel,
    move,
    Atk
}

在这里插入图片描述

三、lua调用数组、List、Dictionary

--数组
local obj = CS.Lesson3()
--Lua使用c#数组相关知识
--长度
local length = obj.array.Length
print(length)

--访问元素
print(obj.array[0])
--遍历要注意 虽然lua中索引从1开始
--但是数组是C#那边的规则  所以  还是按照C#的规则
for i = 0, obj.array.Length-1 do
    print(obj.array[i])
end

--通过lua创建一个C#数组 使用的是Array类中的静态方法即可
local Array1 = CS.System.Array.CreateInstance(typeof(CS.System.Int32),10)
print(Array1.Length)
print(Array1[0])

--列表
obj.list:Add(1)
obj.list:Add(2)
obj.list:Add(3)
--长度
print(obj.list.Count)

for i = 0, obj.list.Count - 1 do
    print(obj.list[i])
end
print(obj.list)

--在Lua中创建一个list
--老版本
local list2 = CS
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值