1. 程式人生 > >Slua自學記錄

Slua自學記錄

前言

公司專案需求,本人第一次接觸Lua熱更和Slua ,學習記錄。

匯入Slua

  1. 匯入外掛後 Slua/LuaObject資料夾下的檔案全部為生成檔案,生成方式為選單中Slua -> All -> Make(每次Make之前最好先Clear一次)
  2. unity - lua互動過程中的檔案有:unity C#指令碼(自寫),LuaObject資料夾下的Lua_C#檔名的指令碼(生成),對應的lua指令碼(自寫)
  3. 若想在lua中呼叫C#類,需在C#類中加入[CustomLuaClass]或[CustomLuaClassAttribute]屬性 如: [CustomLuaClass] public class Deleg : MonoBehaviour

lua與c#互調與簡單互動

Test_interaction.cs

using SLua;
using System.IO;
using UnityEngine;

[CustomLuaClass]
public class Test_interaction : MonoBehaviour
{
    public delegate void TestInteractionDlg(string path, GameObject go);
    public static TestInteractionDlg dlg;
    LuaSvr svr;
    LuaTable self;
LuaFunction update; void Start() { svr = new LuaSvr(); svr.init(null, InitComplete, LuaSvrFlag.LSF_BASIC); } void InitComplete() { LuaState.main.loaderDelegate += LuaLoader; //m_LuaState = LuaState.main; self = (LuaTable)svr.start("testLua"
); update = (LuaFunction)self["update"]; // 呼叫lua的方法 string str = (string)LuaSvr.mainState.getFunction("testFun").call("Hello World!"); Debug.Log("c#---" + str); } void Update() { // 呼叫lua的update函式 if (update != null) update.call(self); } // 呼叫委託 public static void CallD() { if (dlg != null) { dlg("GameObject", new GameObject("SimpleDelegate")); } Debug.Log("c#---callD"); } //載入lua指令碼檔案 [DoNotToLua] public byte[] LuaLoader(string fn) { string newFn = fn.Replace(".", "/"); string path = Application.dataPath + "/Code/luaScript/" + newFn + ".lua"; byte[] data = null; if (File.Exists(path)) { data = File.ReadAllBytes(path); } else { TextAsset txt = Resources.Load<TextAsset>("luaScript/" + newFn); } return data; } // lua呼叫 C# 指令碼函式 public void luaCallCS(string str) { Debug.Log("c#---" + str); } }

testLua.lua

import "UnityEngine"
if not UnityEngine.GameObject then
	error("Click Make/All to generate lua wrap file")
end

local class = {}

function main(  )
	print("lua--- run lua main function")
	local cs = GameObject.Find("Main Camera")

	-- 如果C#類沒有繼承自MonoBehaviour,你可以這樣寫:
	-- local h = Test_interaction()
	-- h.luaCallCS("wtf")
	local te = cs:GetComponent("Test_interaction")
	te:luaCallCS("hellow word")

	local g
	-- 測試委託
	Test_interaction.dlg = function( path,go )
		g = go
		print("lua---"..path,go.name)
	end
	Test_interaction.CallD()

	-- 測試gameobject
	print("lua---g.name:"..g.name)
	print("lua---cs.name:"..cs.name)
	g.transform.parent = cs.transform
	g:AddComponent("UnityEngine.Rigidbody")
	g:AddComponent("UnityEngine.BoxCollider")
	local c = g:AddComponent("UnityEngine.MeshRenderer")
	c.probeAnchor = cs.transform

	-- 如果要使用update函式,則需要返回class-- return class
end

function testFun( a )
	print("lua--- run this testFun()")
	local  name = "test"
	a = a..name
	return a
end

-- 在C#的Update函式中被呼叫
function class:update(  )
	print(Time.deltaTime)
end