Slua自學記錄
阿新 • • 發佈:2018-12-11
前言
公司專案需求,本人第一次接觸Lua熱更和Slua ,學習記錄。
匯入Slua
- 匯入外掛後 Slua/LuaObject資料夾下的檔案全部為生成檔案,生成方式為選單中Slua -> All -> Make(每次Make之前最好先Clear一次)
- unity - lua互動過程中的檔案有:unity C#指令碼(自寫),LuaObject資料夾下的Lua_C#檔名的指令碼(生成),對應的lua指令碼(自寫)
- 若想在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