目录
创建C#入口
首先我们新建一个C#脚本,取名为Main,因为Lua中没有办法直接访问C#,一定是先从C#中调用lua再将核心逻辑让lua来编写
public class Main : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
LuaMgr.GetInstance().Init();
LuaMgr.GetInstance().DoLuaFile("Main");
}
}
Lua调用类
创建调用类的脚本,然后再Main的脚本中调用
require("Lesson1CallClass")
接着来编写调用类的lua脚本
print("----------------------Lua调用C#类相关知识---------------------")
--lua中使用C#的类
--固定格式:CS.命名空间.类名
--Unity的类 比如 GameObject Transform等—— CS.UnityEngine.类名
--CS.UnityEngine.GameObject
--通过C#中的类实例化一个对象
--lua中没有new,直接类名括括号就是实例化对象
--默认调用的,相当于就是无参构造
local obj1=CS.UnityEngine.GameObject()
local obj2=CS.UnityEngine.GameObject("xxx")
--为了方便使用与节约性能,定义全局变量存储C#的类
GameObject=CS.UnityEngine.GameObject
local obj3=GameObject("yyyyy")
--类中的静态对象可以直接使用.来调用
local obj4=GameObject.Find("xxx")
--得到其中的成员变量也是直接.对象
print(obj4.transform.position)
CS.UnityEngine.Debug.Log(obj4.transform.position)
--使用对象中的成员方法,要加:调用
Vector3=CS.UnityEngine.Vector3
obj4.transform:Translate(Vector3.right)
CS.UnityEngine.Debug.Log(obj4.transform.position)
运行出现为:1.场景中出现空物体 2.打印信息 3.位置坐标发生修改
刚才调用的都是U3d中自带的类,现在我们尝试C#自定义类
public class Test
{
public void Speak(string str)
{
Debug.Log("Test" + str);
}
}
namespace tx
{
public class Test2
{
public void Speak(string str)
{
Debug.Log("Test2"+str);
}
}
}
--调用没有在命名空间中的自定义类
local t1=CS.Test()
t1:Speak("11111111")
--调用在命名空间中的自定义类
local t2=CS.tx.Test2()
t2:Speak("2222222")
继承Mono的类:
--继承Mono的类,是不能直接new的
local obj5=GameObject("加脚本Test")
--通过GameObject的AddComponent添加脚本,由于lua中不支持无参泛型函数,我们使用另一个重载
--xlua提供一个方法typeof 得到类的type
obj5:AddComponent(typeof(CS.LuaCallCSharp))
运行可以看到
Lua调用枚举
新建一个lua脚本在Main中调用,然后写
--枚举调用
--调用Unity中的枚举
--枚举调用规则与调用类相似:CS.命名空间.枚举名.枚举成员
PrimitiveType=CS.UnityEngine.PrimitiveType
GameObject=CS.UnityEngine.GameObject
local obj = GameObject.CreatePrimitive(PrimitiveType.Cube)
这样在场景中就会出现一个Cube
如果是自定义脚本,在C#中
public enum myem
{
Idel,
Move,
Jump,
Atk
}
然后在lua中我们调用并进行枚举的一系列转换,利用.__CastFrom(),可以看到
--自定义枚举
myem=CS.myem
local x=myem.Idel
print(x)
--枚举转换相关rgs
--数值转枚举
local a=myem.__CastFrom(1)
print(a)
--字符串转枚举
local b=myem.__CastFrom("Atk")
print(b)
Lua调用数组,列表,字典
数组,列表,字典在lua中的使用都遵循C#的规则,我们先在C#中创建
public int[] arr=new int[5] { 1, 2, 3 ,7,6};
public List<int> list=new List<int>();
public Dictionary<int,string> dic = new Diction