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.GameObjectCS.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