Slua自学(一)
前言
公司项目需求,本人第一次接触lua热更 ,学习记录。
导入Slua
从slua作者的gihub上下载slua的demo
- 导入插件后 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