首先感谢【Unity Lua技术交流QQ群】(群号:341746602 )里面的大神对我这种unity和lua新手的指导。论坛网址:http://game.ceeger.com/forum/read.php?tid=16483
大神们一直在更新着。
从小不爱记忆东西,但是写写东西我还是蛮爱意的,嘿嘿。
由于需要,开始接触ulua,ulua在unity应用更新上面的作用还是蛮大的,经过好几个周的研究,自己也琢磨了一套应用动态更新的办法,由于是新手,就没考虑很多的问题
比如:资源释放,资源加密揭秘,等可能造成程序很卡的原因。下面我会记录下ulua代码和C#之间沟通的一些简单的方法,省得以后忘了还得看项目。哈哈。
ulua的机制是利用的反射,就是lua代码和C#代码相互映射,这样执行效率不如直接将函数注册到对应的库里面执行效率高。
首先是导入了 C#集合以及'UnityEngine'
luanet.load_assembly("Assembly-CSharp")
luanet.load_assembly('UnityEngine')
下面导入了一个名字为“CSharpClass_name”的.cs格式的脚本类。
--import C# Class
CSharpClass= luanet.import_type('CSharpClass_name');
也可以导入像NGUI里面的类,比如iTWEEN
iTween = luanet.import_type('iTween');这样便可以在lua脚本里面调用iTween 里面的函数,Unity Lua交流群里面 给出的例子,写了一个通用的脚本,比如名叫“define.lua”;
在里面可以将在程序里面运用到的unity和csharp相关的类进行定义。方式如下
GameObject = UnityEngine.GameObject;
这样就可以在程序里面使用GameObject 类,特别的方便。
导入的类的使用方式:以上面方式导入的iTween 为例,调用他的Moveto函数,
function MoveTo(args)
local go = args["gameobject"];
local info = args["hashtable"];
iTween.Moveto(go,info);
end
上面的函数就能实现相应的功能,go是你要移动的物体,hashtable里面保存相应的参数。
导入的GameObject类在lua里面的使用方法如下
GameObject.Destroy(obj);
上面就可以将一个对象进行销毁。形式就像上面一样。
导入的自己编写的C#类的使用方法,调用里面的成员函数,如:CSharpClass里面有OutputString函数
function PrintAString()
CSharpClass.OutputString('print Now 我是一个好儿郎咿呀咿呀哟‘)
end
在Lua里面使用C#的类可以通过两种方式,我会的两种,一种就是将C#类付给lua的一个变量;另一种方法就是通过GetComponent方法,将C#引进到Lua里面。
这两种方法都很方便,下面记录第二种方法的使用:
local go=GameObject.Find(obj_name’);
local labletext = go:GetComponent('UILabel');
上面显示获得了名字为obj_name对象,然后利用GameObject有的GetComponent方法,得到了“UILabel”组件。对象调用自己的函数用冒号。
关于用点号还是冒号很容易分辨出来,在程序中如果你出现“instance method 'AddComponent' requires a non null target object”,这就说明了你在程序中使用的语法有错误。
C#中大部分数据类型在lua中都可以使用,像List,Hashtable,object,这些就很方便从C#传过来数据给Lua使用。
下面说一下C#里面使用Lua,我在unity里面使用的插件是ulua,这是老板发现的,于是推荐我看一下,为以后的工作做准备。
交流群里面有uLua_v1.03。很好用,容易上手。
首先导入luainterface:using LuaInterface ;
然后就可以开始定义luastate,这个luastate可以管理你在C#脚本中使用到的和lua相关的东西,以iLua为例。
iLua.DoString()或者是dofile可以将用到的lua代码编译一下,这样就可以在后面通过ilua来访问里面的方法或者变量。
ilua.GetFunction ("my_lua_function_name"); 这样就可以从脚本中得到名字为my_lua_function_name的函数,把它赋值给_luafunction,然后通过
_luafunction.Call(),或者call(),进行使用,返回object类型的数组,可以通过合理的类型转换变成你需要的值类型方便书用。
对于lua的table类型的数据,在C#中使用方式如下:LuaTable itable = new LuaTable (1,ilua);然后就可以在C#面使用table返回的数据了,很实用。
下面一段代码可以调用名字为func,参数类型为Hashtable的lua函数:
public object[] CallMethod(string func,Hashtable args){
print ("CallMethod(string func,Hashtable args)");
if (ilua == null) return null;
if (!luafunctions.ContainsKey(func)) {
luafunctions[func] = ilua.GetFunction(func);
}
if (luafunctions[func] != null) {
return luafunctions[func].Call(args);
}
return null;
}
对lua里面变量参数赋值地方法如下:
public void SetLuaData(){
ilua ["transform"] = transform;
ilua ["gameObject"] = gameObject;
}
我觉得lua实现C#里面的东西就是麻烦些,C#的类代码也没怎么读,我想,大神们的做法应该会直接用lua代码实现C#相同的功能,待我再练练吧,哈哈。
2014/11/21
最近在搞一个小的适合更新的框架,几经修改,老板终于说还凑合了,然后就在做可以动态改变的一些东西,大多用来做任务更新的,
我就随便弄了一个窗口,然后添加了ScrollView在里面,之后向他下面的Grid里面添加儿子,就类似活动窗口那些滚动的活动内容,玩家可以滑动查看当前可以领的任务或者活动,
用到了一些简单的方法,记录一下
function AddMarketGoods(goodsnum)
for i=1,goodsnum do
mgoods = NGUITools.AddChild(GoodsGrid,goodsperfab);
mgoods.name = "goods_"..i;
goodslabel = LuaHelper.GetComponentInChildren(mgoods,"UILabel");
goodslabel.text = "价钱:"..tostring(i*100).."元宝";
end
gird = GoodsGrid:GetComponent('UIGrid');
gird.enabled = true;
gird:Reposition();
goodsscrollview = MarketScrollView:GetComponent('UIScrollView');
goodsscrollview:ResetPosition();
end
上面就可以完美的显示以及排序一个Gird了