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