lua調用c#
lua調用c#的對象
所有c#對象都放在CS中
CS.System;CS.System.IO;CS.UnityEngine.GameObject();
lua調用c#靜態變量
基本腳本結構
【luai腳本】
-- 全局變量
s1 = "this is lua"
--引用unity方法
local GameObject = CS.UnityEngine.GameObject
local UI = CS.UnityEngine.UI;
【c#腳本】
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using XLua;
using System;
using System.IO;
namespace XLuaTest1
{
public class LuaTest : MonoBehaviour
{
private LuaEnv luaenv;
void Start ()
{
// 啓動lua虛擬機
luaenv = new LuaEnv();
// luaenv.AddLoader(LuaLoader);
// 讀取Resources下的腳本
TextAsset luaScript = Resources.Load<TextAsset>("lua.lua") as TextAsset;
// 運行腳本
luaenv.DoString(luaScript.text, "");
//獲取lua全局屬性1
string mStr = luaenv.Global.Get<string>("s1");
Debug.Log("lua globle string:" + mStr);
}
void Update ()
{
// 每幀gc
if (luaenv != null)
{
luaenv.Tick();
}
}
void Destroy()
{
//釋放lua
if (luaenv != null)
{
luaenv.Dispose();
}
}
//腳本讀取器
private byte[] LuaLoader(ref string filename)
{
TextAsset text = Resources.Load("Lua/" + filename + ".lua") as TextAsset;
return text.bytes;
}
}
}
調用類
【lua腳本】
引用 CS腳本 -> XluaTest1命名空間 -> mClass類
local mClass = CS.XLuaTest1.myClass;
local testObj = mClass()
【C#腳本】
namespace XLuaTest1
{
public class myClass
{
}
}
調用屬性、方法
調用屬性、靜態屬性、靜態方法用".“連接。調用方法用”:"連接。
【lua腳本】
-- 引用 CS腳本 -> XluaTest1命名空間 -> mClass類
local mClass = CS.XLuaTest1.myClass;
-- 實例化一個類,不需要new關鍵字
local testObj = mClass()
-- 調用變量、方法
print("num",testObj.num)
testObj:Func()
-- 調用變量、方法, 原始類名 + . + 變量或方法
print("staticNum",mClass.staticNum)
mClass.staticFunc()
【C#腳本】
namespace XLuaTest1
{
// [LuaCallCSharp]
public class myClass
{
public static int staticNum = 111;
public static void staticFunc()
{
Debug.Log("靜態值 = " + staticNum);
}
public int num = 222;
public void Func()
{
Debug.Log("變量值 = " + num);
}
}
}
調用枚舉
【lua腳本】
-- 實例化類, cs > 命名空間 > 類
local myNum = CS.XLuaTest1.myNum()
-- 引用枚舉
local enumNum = CS.XLuaTest1.enumNum
-- 調用c#方法,並傳入枚舉,返回枚舉值
local enumValue = myNum:SwitchNum(enumNum.one)
print("enumValue",enumValue)
-- 根據枚舉的value,返回key
myNum:SwitchNum(enumNum.__CastFrom(0))
-- 根據枚舉的key,返回值
myNum:SwitchNum(enumNum.__CastFrom("one"))
-- 方法 直接傳入枚舉的值
myNum:SwitchNum(0)
-- 方法 直接傳入枚舉的key
myNum:SwitchNum("one");
【C#腳本】
namespace XLuaTest1
{
// 創建枚舉
[LuaCallCSharp]
public enum enumNum
{
one,
two
}
[LuaCallCSharp]
// 使用枚舉的方法
class myNum
{
public enumNum SwitchNum(enumNum num)
{
switch (num)
{
case enumNum.one:
Debug.Log("one");
break;
case enumNum.two:
Debug.Log("two");
break;
}
return num;
}
}
}
調用Action
【lua腳本】
local mClass = CS.XLuaTest1.myClass;
local testObj = mClass()
testObj.act();
【C#腳本】
namespace XLuaTest1
{
[LuaCallCSharp]
public class myClass
{
public Action act = ()=>{
Debug.Log("c# Action");
};
}
調用委託
【lua腳本】
// 自定義方法
function lua_act(arg)
print("lua_act:", arg)
end
// 實例化類
local testObj = CS.XLuaTest1.mClass()
// 引用委託
local act = testObj.act1
// 將c#腳本中的函數與lua腳本中的函數 交給c#的委託
act = act + lua_act + testObj.act2
// 運行委託
act("lua call c#")
【C#腳本】
namespace XLuaTest1
{
[LuaCallCSharp]
public class mClass
{
// 定義一個委託
public delegate void mDelegate(string arg);
// 委託函數
public mDelegate act1 = (string s)=>{
Debug.Log("act1:" + s);
};
// 委託函數
public mDelegate act2 = (string s)=>{
Debug.Log("act2:" + s);
};
}
}
調用事件
【lua腳本】
-- 自定義方法
function lua_act(arg)
print("lua_act:", arg)
end
-- --實例化類
local testObj = CS.XLuaTest1.mClass()
-- 將lua函數 綁定 c#事件
testObj:mEvent("+", lua_act)
-- 將c#函數 綁定 c#事件
testObj:mEvent("+", testObj.act1)
testObj:mEvent("+", testObj.act2)
-- 通過事先定義的接口 運行c#中的事件
testObj:doEvent("lua call c#")
【C#腳本】
namespace XLuaTest1
{
[LuaCallCSharp]
public class mClass
{
// 此處 必須使用該關鍵字 CSharpCallLua
[CSharpCallLua]
// 定義委託
public delegate void mDelegate(string arg);
// 定義關鍵字
public event mDelegate mEvent;
// c#方法1
public mDelegate act1 = (string s)=>{
Debug.Log("act1:" + s);
};
// c#方法2
public mDelegate act2 = (string s)=>{
Debug.Log("act2:" + s);
};
// 運行
public void doEvent(string s){
Debug.Log("event:" + s);
mEvent("do event");
}
}
}
泛型
使用擴展的辦法處理lua不支持的泛型需求,或其他需求
【lua腳本】
-- --實例化類
local testObj = CS.XLuaTest1.Extended()
-- 傳入目標對象,返回c#進行相應處理
testObj.AddComponentRigidbody(gameobject)
【C#腳本】
namespace XLuaTest1
{
[LuaCallCSharp]
static class Extended{
public static Rigidbody AddComponentRigidbody(GameObject gameobject)
{
return gameobject.AddComponent<Rigidbody>();
}
}
}
靜態列表
使用擴展的辦法處理lua不支持的泛型需求,或其他需求
【lua腳本】
-- --實例化類
local testObj = CS.XLuaTest1.luaCallCSharpList("")
-- 傳入目標對象,返回c#進行相應處理
testObj.AddComponentRigidbody(gameobject)
【C#腳本】
namespace XLuaTest1
{
[LuaCallCSharp]
public static List<Type> luaCallCSharpList = new List<Type>()
{
typeof(GameObject),
};
}
調用unity對象
創建unity引用
local GameObject = CS.UnityEngine.GameObject
local UI = CS.UnityEngine.UI;
創建unity對象
local go = GameObject("Cube")
修改unity對象屬性
--修改
go.name = "myCube"
--訪問
print("GameObject1:", go.name)
調用unity對象的方法
go:SetActive(false)
go.SetActive(go, false)
讀取unity靜態屬性
--訪問
local Time = CS.UnityEngine.Time
print("Time.deltaTime:", Time.deltaTime)
--修改
Time.timeScale = 0.5
獲取unity場景中的物體
local mainCamera = GameObject.Find("Main Camera")
print("mainCamera:", mainCamera.name)
獲取unity物體的組件
--Camera組件
local compCamera = mainCamera:GetComponent("Camera")
print("compCamera:",compCamera.fieldOfView)
--Transform組件
local compTransform = mainCamera:GetComponent("Transform")
-- 調用組件下的方法
print("compTransform:",compTransform:GetChild(0).name)