xlua用法,lua腳本調用c#

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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章