现在的位置: 首页 > 综合 > 正文

自己总结的ulua代码写的一些方法

2017年02月16日 ⁄ 综合 ⁄ 共 3332字 ⁄ 字号 评论关闭

 

  首先感谢【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了





抱歉!评论已关闭.