11.Lua调用C#的类

11.Lua调用CSharp-类


11.1 知识点

准备工作

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

基本方法概述

  • Lua中使用C#的类非常简单
  • 使用C#的类的固定套路 命名空间.类名
  • Unity的类 比如 GameObject Transform等等 —— UnityEngine.类名
  • 例如 UnityEngine.GameObject UnityEngine.Transform等等
  • 和xLua的区别就是 不需要再加CS
  • 需要在Lua管理器中添加绑定Lua中使用的Unity的代码,以便在Lua中使用Unity类型而不报错
  • 如果自定义类报错 需要在CustomSetting中去加上对应类型 然后生成代码
// 绑定 Lua 中使用的 Unity 类型,以便在 Lua 中使用 Unity 类型而不报错
LuaBinder.Bind(luaState);

实例化定义好的对象

  • 通过C#中的类 可以实例化一个对象 lua中没有new 命名空间.类名(构造函数参数) 就是实例化对象
--无参构造 会在场景中实例化一个GameObject对象
local gameObject1 = UnityEngine.GameObject()

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

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

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

对象成员的使用

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

--对象的成员变量 通过 对象.成员变量 来使用
print(gameObject4.transform.position)--Lua打印对象的位置 table:0x2612C796518
Debug = UnityEngine.Debug--把Debug类存储起来 注意Debug类要去CustomSetting中添加类的绑定
Debug.Log(gameObject4.transform.position)--Unity打印对象的位置 (0.0, 0.0, 0.0)

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

实例化自定义的类

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

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

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

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

CustomSetting中添加类的绑定 生成代码

_GT(typeof(Lesson11_Test1)),
_GT(typeof(MrTao.Lesson11_Test2)),
_GT(typeof(Lesson11_Test3)),

在Lua脚本实例化测试类

  • 自定义类的使用方法和定义好的类相同 注意命名空间即可
--没有指定命名空间的自定义类 要去CustomSetting中添加类的绑定 生成代码
local test1 = Lesson11_Test1()
test1:Speak("我是Lua实例化的test1")--Lesson11_Lua调用CSharp_类_Test1说话:我是Lua实例化的test1

--指定命名空间的自定义类 要去CustomSetting中添加类的绑定 生成代码
local test2 = MrTao.Lesson11_Test2()
test2:Speak("我是Lua实例化的test2")--Lesson11_Lua调用CSharp_类_Test2说话:我是Lua实例化的test2

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

11.2 知识点代码

Lesson11_Lua调用CSharp_类.lua

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

print("**********知识点一 基本方法概述************")

--lua中使用C#的类非常简单
--使用C#的类的固定套路 命名空间.类名
--Unity的类 比如 GameObject Transform等等 —— UnityEngine.类名
--例如 UnityEngine.GameObject UnityEngine.Transform等等
--和xLua的区别就是 不需要再加CS
--需要在Lua管理器中添加绑定Lua中使用的Unity的代码,以便在Lua中使用Unity类型而不报错
--如果自定义类报错 需要在CustomSetting中去加上对应类型 然后生成代码

print("**********知识点二 实例化定义好的对象************")

--通过C#中的类 可以实例化一个对象 lua中没有new  命名空间.类名(构造函数参数) 就是实例化对象

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

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

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

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


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

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

--对象的成员变量 通过 对象.成员变量 来使用
print(gameObject4.transform.position)--Lua打印对象的位置 table:0x2612C796518
Debug = UnityEngine.Debug--把Debug类存储起来 注意Debug类要去CustomSetting中添加类的绑定
Debug.Log(gameObject4.transform.position)--Unity打印对象的位置 (0.0, 0.0, 0.0)

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


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

--没有指定命名空间的自定义类 要去CustomSetting中添加类的绑定 生成代码
local test1 = Lesson11_Test1()
test1:Speak("我是Lua实例化的test1")--Lesson11_Lua调用CSharp_类_Test1说话:我是Lua实例化的test1

--指定命名空间的自定义类 要去CustomSetting中添加类的绑定 生成代码
local test2 = MrTao.Lesson11_Test2()
test2:Speak("我是Lua实例化的test2")--Lesson11_Lua调用CSharp_类_Test2说话:我是Lua实例化的test2

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

Lesson11_Lua调用CSharp_类

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

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

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


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

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


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

×

喜欢就点赞,疼爱就打赏