参考链接 :
http://www.manew.com/thread-91203-1-1.html
这是第二篇关于ulua的博客,关于基础的部分,请看
第一篇。
里面的AddButtonClick, Text, Add 三个方法,我们会在之后使用。
在这里下载ulua : https://github.com/jarjin/LuaFramework_UGUI
首先,我们新建一个 TestComponemt.cs 脚本,使用它来处理跟lua脚本的交互
using UnityEngine;
using System.Collections;
using LuaInterface;
using LuaFramework;
using UnityEngine.UI;
namespace LuaFramework
{
public class TestComponemt : MonoBehaviour
{
public LuaTable table;
//添加监听
public static void AddButtonClick(GameObject go, LuaFunction luafunc)
{
if (go == null || luafunc == null)
return;
Button btn = go.GetComponent<Button> ();
if (btn == null)
return;
btn.onClick.AddListener
(
delegate()
{
luafunc.Call(go);
}
);
}
public static void Text(GameObject go, string str)
{
if (go == null || str == null) return;
Text txt = go.GetComponent<Text>();
if (txt == null) return;
txt.text = str;
}
//清除监听
public static void ClearButtonClick(GameObject go)
{
if (go == null)
return;
Button btn = go.GetComponent<Button> ();
if (btn == null)
return;
btn.onClick.RemoveAllListeners();
}
public static LuaTable Add(GameObject go, LuaTable tableClass)
{
LuaFunction fun = tableClass.GetLuaFunction("New");
if (fun == null)
return null;
object[] rets = fun.Call(tableClass);
if (rets.Length != 1) return null;
TestComponemt cmp = go.AddComponent<TestComponemt>();
cmp.table = (LuaTable)rets[0];
cmp.CallAwake();
return cmp.table;
}
public static LuaTable Get(GameObject go, LuaTable table)
{
TestComponemt[] cmps = go.GetComponents<TestComponemt>();
foreach (TestComponemt item in cmps)
{
string mat1 = table.ToString();
string mat2 = item.table.GetMetaTable().ToString();
if(mat1 == mat2)
{
return item.table;
}
}
return null;
}
void CallAwake()
{
LuaFunction fun = table.GetLuaFunction("Awake");
if (fun != null)
fun.Call(table, gameObject);
}
void Start()
{
LuaFunction fun = table.GetLuaFunction("Start");
if (fun != null)
fun.Call(table, gameObject);
}
void Update()
{
//效率问题有待测试和优化
//可在lua中调用UpdateBeat替代
LuaFunction fun = table.GetLuaFunction("Update");
if (fun != null)
fun.Call(table, gameObject);
}
}
}
里面的AddButtonClick, Text, Add 三个方法,我们会在之后使用。
然后制作如下的简单UI界面和cube
并且把它们放到如图所示的文件夹内,制作成prefab。
然后找到 Packager.cs 脚本,添加如下代码:
然后我们来写 myTestLua.lua 的代码,如下:
myTestLua = { name = "myTestLua"}
local go
local cube
function myTestLua:Awake()
print("Awake + "..self.name)
LuaHelper = LuaFramework.LuaHelper;
resMgr = LuaHelper.GetResManager();
resMgr:LoadPrefab('mytestpanel', {'myTestPanel', 'Cube'}, OnFinishLoad)
resMgr:LoadPrefab('cube', {'Cube'}, OnCubeLoadFinish)
print("Awake + "..self.name)
end
function OnFinishLoad(objs)
go = UnityEngine.GameObject.Instantiate(objs[0]);
local parent = UnityEngine.GameObject.Find("Canvas");
go.transform.parent = parent.transform;
go.transform.localScale = Vector3.one;
go.transform.localPosition = Vector3.zero;
local btn = go.transform:FindChild("Button").gameObject;
LuaFramework.TestComponemt.AddButtonClick(btn, OnClick);
end
function OnCubeLoadFinish(objs)
cube = UnityEngine.GameObject.Instantiate(objs[0])
print("load finish")
UpdateBeat:Add(Update, cube)
end
function Update()
local Input = UnityEngine.Input
local h = Input.GetAxis("Horizontal")
local v = Input.GetAxis("Vertical")
local x = cube.transform.position.x + h
local y = cube.transform.position.y + v
cube.transform.position = Vector3.New(x, y, 0)
end
function OnClick()
local text = go.transform:FindChild("Text").gameObject;
print("can change text?")
text:GetComponent(typeof(UnityEngine.UI.Text)).text = "Hello, LuaFramework";
--LuaFramework.TestComponemt.Text(text, "Hello, LuaFramework");
print("ok?")
end
function myTestLua:Update()
end
function myTestLua:New(obj)
local o = {}
setmetatable(o, self)
self.__index = self
return o
end
function testPrint()
print("hello, LuaFramework "..self.name)
end
return myTestLua
最后,运行程序,点击button按钮,点击WASD键,程序运行正常。
如有不懂,欢迎评论