12.Lua调用C#的类

12.Lua调用CSharp-类


12.1 知识点

准备工作

  • Lua想调用C# 需要先在Unity调用C#脚本启动Lua脚本 再在Lua脚本进行编写
LuaManager.Instance.Init();
LuaManager.Instance.DoLuaFile("Lesson12_Lua调用CSharp_类");

基本方法概述

  • Lua中使用C#的类非常简单
  • 使用C#的类的固定套路 CS.命名空间.类名
  • Unity的类 比如 GameObject Transform等等 —— CS.UnityEngine.类名
  • 例如 CS.UnityEngine.GameObject CS.UnityEngine.Transform等等

实例化定义好的对象

  • 通过 C# 类型可在 Lua 侧构造实例:Lua 没有 new 关键字,直接写 CS.命名空间.类名(构造参数) 即等价于调用构造函数。
-- 无参构造 会在场景中实例化一个GameObject对象
local gameObject1 = CS.UnityEngine.GameObject()

-- 有参构造在场景中实例化一个名为韬老狮的GameObject对象
local gameObject2 = CS.UnityEngine.GameObject("韬老狮")

-- 为了方便使用 并且节约性能 通常定义全局变量存储来自C#中的类 相当于给类取了一个别名
GameObject = CS.UnityEngine.GameObject

-- 实例化一个名为韬老狮帅的GameObject对象
local gameObject3 = GameObject("韬老狮帅") -- 使用存储的GameObject类 不需要CS.UnityEngine.了

对象成员的使用

  • 类的静态成员 通过 类名.静态成员 来使用
  • 对象的成员变量 通过 对象.成员变量 来使用
  • 对象的成员方法 通过 对象:成员方法 来使用
--类的静态成员 通过 类名.静态成员 来使用
local gameObject4 = GameObject.Find("韬老狮")--调用GameObject类的静态方法Find

--对象的成员变量 通过 对象.成员变量 来使用
print(gameObject4.transform.position)--Lua打印对象的位置 LUA: (0.0, 0.0, 0.0): 0

Debug = CS.UnityEngine.Debug--把Debug类存储起来
Debug.Log(gameObject4.transform.position)--Unity打印对象的位置 (0.0, 0.0, 0.0)

--对象的成员方法 通过 对象:成员方法 来使用
Vector3 = CS.UnityEngine.Vector3
gameObject4.transform:Translate(Vector3.right)
Debug.Log(gameObject4.transform.position)--(1.0, 0.0, 0.0)

实例化自定义的类

在C#脚本自定义几个测试类

public class Lesson12_Test1
{
    public void Speak(string message)
    {
        Debug.Log("Lesson12_Lua调用CSharp_类_Test1说话:" + message);
    }
}

namespace MrTao
{
    public class Lesson12_Test2
    {
        public void Speak(string message)
        {
            Debug.Log("Lesson12_Lua调用CSharp_类_Test2说话:" + message);
        }
    }
}

public class Lesson12_Test3 : MonoBehaviour
{
    public void Speak(string message)
    {
        Debug.Log("Lesson12_Lua调用CSharp_类_Test3说话:" + message);
    }
}

在Lua脚本实例化测试类

  • 自定义类的使用方法和定义好的类相同 注意命名空间即可
--没有指定命名空间的自定义类
local test1 = CS.Lesson12_Test1()
test1:Speak("我是Lua实例化的test1")--Lesson12_Lua调用CSharp_类_Test1说话:我是Lua实例化的test1

--指定命名空间的自定义类
local test2 = CS.MrTao.Lesson12_Test2()
test2:Speak("我是Lua实例化的test2")--Lesson12_Lua调用CSharp_类_Test2说话:我是Lua实例化的test2

--继承MonoBehaviour的自定义类
--继承MonoBehaviour的自定义类不能直接new 
--通过实例化的GameObject对象的AddComponent方法添加脚本
--xlua中不支持 无参泛型函数  所以我们需要使用AddComponent方法传入继承了MonoBehaviour的类的Type重载
--xlua提供了一个重要方法 typeof 可以得到类的Type
local gameObject5 = GameObject("韬老狮创建的要加MonoBehaviour脚本的GameObject对象")
gameObject5:AddComponent(typeof(CS.Lesson12_Test3))
--通过实例化的GameObject对象的GetComponent方法得到脚本 并调用方法
gameObject5:GetComponent(typeof(CS.Lesson12_Test3)):Speak("我是Lua实例化的test3")--Lesson12_Lua调用CSharp_类_Test3说话:我是Lua实例化的test3

12.2 知识点代码

Lesson12_Lua调用CSharp_类.lua

print('我是Lua脚本 Lesson12_Lua调用CSharp_类')

print("**********知识点一 基本方法概述************")
--lua中使用C#的类非常简单
--使用C#的类的固定套路 CS.命名空间.类名
--Unity的类 比如 GameObject Transform等等 —— CS.UnityEngine.类名
--例如 CS.UnityEngine.GameObject CS.UnityEngine.Transform等等


print("**********知识点二 实例化定义好的对象************")
--通过C#中的类 可以实例化一个对象 lua中没有new CS.命名空间.类名(构造函数参数) 就是实例化对象

--无参构造 会在场景中实例化一个GameObject对象
local gameObject1 = CS.UnityEngine.GameObject()

--有参构造在场景中实例化一个名为韬老狮的GameObject对象
local gameObject2 = CS.UnityEngine.GameObject("韬老狮")

--为了方便使用 并且节约性能 通常定义全局变量存储来自C#中的类 相当于给类取了一个别名
GameObject = CS.UnityEngine.GameObject

-- 实例化一个名为韬老狮帅的GameObject对象
local gameObject3 = GameObject("韬老狮帅")--使用存储的GameObject类 不需要CS.UnityEngine.了


print("**********知识点三 对象成员的使用************")

--类的静态成员 通过 类名.静态成员 来使用
local gameObject4 = GameObject.Find("韬老狮")--调用GameObject类的静态方法Find

--对象的成员变量 通过 对象.成员变量 来使用
print(gameObject4.transform.position)--Lua打印对象的位置 LUA: (0.0, 0.0, 0.0): 0
Debug = CS.UnityEngine.Debug--把Debug类存储起来
Debug.Log(gameObject4.transform.position)--Unity打印对象的位置 (0.0, 0.0, 0.0)

--对象的成员方法 通过 对象:成员方法 来使用
Vector3 = CS.UnityEngine.Vector3
gameObject4.transform:Translate(Vector3.right)
Debug.Log(gameObject4.transform.position)--(1.0, 0.0, 0.0)


print("**********知识点四 实例化自定义的类************")
--自定义类的使用方法和定义好的类相同 注意命名空间即可

--没有指定命名空间的自定义类
local test1 = CS.Lesson12_Test1()
test1:Speak("我是Lua实例化的test1")--Lesson12_Lua调用CSharp_类_Test1说话:我是Lua实例化的test1

--指定命名空间的自定义类
local test2 = CS.MrTao.Lesson12_Test2()
test2:Speak("我是Lua实例化的test2")--Lesson12_Lua调用CSharp_类_Test2说话:我是Lua实例化的test2

--继承MonoBehaviour的自定义类
--继承MonoBehaviour的自定义类不能直接new 
--通过实例化的GameObject对象的AddComponent方法添加脚本
--xlua中不支持 无参泛型函数  所以我们需要使用AddComponent方法传入继承了MonoBehaviour的类的Type重载
--xlua提供了一个重要方法 typeof 可以得到类的Type
local gameObject5 = GameObject("韬老狮创建的要加MonoBehaviour脚本的GameObject对象")
gameObject5:AddComponent(typeof(CS.Lesson12_Test3))
--通过实例化的GameObject对象的GetComponent方法得到脚本 并调用方法
gameObject5:GetComponent(typeof(CS.Lesson12_Test3)):Speak("我是Lua实例化的test3")--Lesson12_Lua调用CSharp_类_Test3说话:我是Lua实例化的test3

Lesson12_Lua调用CSharp_类

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Lesson12_Lua调用CSharp_类 : MonoBehaviour
{
    void Start()
    {
        LuaManager.Instance.Init();
        LuaManager.Instance.DoLuaFile("Lesson12_Lua调用CSharp_类");
    }
}

public class Lesson12_Test1
{
    public void Speak(string message)
    {
        Debug.Log("Lesson12_Lua调用CSharp_类_Test1说话:" + message);
    }
}


namespace MrTao
{
    public class Lesson12_Test2
    {
        public void Speak(string message)
        {
            Debug.Log("Lesson12_Lua调用CSharp_类_Test2说话:" + message);
        }
    }
}

public class Lesson12_Test3 : MonoBehaviour
{
    public void Speak(string message)
    {
        Debug.Log("Lesson12_Lua调用CSharp_类_Test3说话:" + message);
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏