【ulua入门】(2) 动态实例化GameObject,然后更改UGUI元素的值,使用案件移动物体
2017-01-10 21:06
459 查看
参考链接 : http://www.manew.com/thread-91203-1-1.html
在这里下载ulua : https://github.com/jarjin/LuaFramework_UGUI
这是第二篇关于ulua的博客,关于基础的部分,请看第一篇。
首先,我们新建一个 TestComponemt.cs 脚本,使用它来处理跟lua脚本的交互
里面的AddButtonClick, Text, Add 三个方法,我们会在之后使用。
然后制作如下的简单UI界面和cube
并且把它们放到如图所示的文件夹内,制作成prefab。
然后找到 Packager.cs 脚本,添加如下代码:
然后我们来写 myTestLua.lua 的代码,如下:
最后,运行程序,点击button按钮,点击WASD键,程序运行正常。
如有不懂,欢迎评论
在这里下载ulua : https://github.com/jarjin/LuaFramework_UGUI
这是第二篇关于ulua的博客,关于基础的部分,请看第一篇。
首先,我们新建一个 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键,程序运行正常。
如有不懂,欢迎评论
相关文章推荐
- 使用ArcGIS Server怎么动态设置Host和MapServerObject属性
- asp.net 2.0 移动开发入门之使用模拟器
- 利用Microsoft.ReportingServices.RdlObjectModel.dll文件对rdl进行动态更改
- cocos2d-x 如何使用CCProgressTimer作为血条,实现跟随怪物进行移动,自动掉血,然后死亡。
- 使用javassist框架进行动态的更改Class类
- ObjectQuery for Castle.ActiveRecord 使用指南(1):入门
- ps入门教程:选择工具、移动工具、索套工具的使用
- MapX中使用动态图层AnimationLayer,移动图元时标注和图元分离问题解决办法。
- C#入门学习-----选项卡(更改显示样式、动态添加/删除、获得名称)
- Jquery动态更改一张位图的src与Attr的使用
- 使用鼠标拖曳的方式移动、更改panel控件的大小
- 使用javascript操作多选列表框,实现动态增加删除,左右移动,上下排序移动等功能。
- jaxb jaxp使用xml来生成动态页面 - xml xsd xsl ( xpath xslt ) css 概念入门
- Ruby on Rails 入门之:(21) ruby中代码块的使用以及动态执行代码
- unity3d和下OrtHello的使用教程 (二) 移动物体,碰撞等
- oracle pl/sql 入门+ 数组使用+游标+动态SQL
- 动态更改按钮的可视状态及VisualTreeHelper的使用
- 机器人眼中的图片上是固定的==有物体在上面移动==二张图片的对比即活动识别物==特简单的机器人动态识别技术.
- 使用javassist框架进行动态的更改Class类
- Unity中GameObject对子物体的树形结构管理