自己總結的ulua代碼寫的一些方法

分類:編程 時間:2017-02-17

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

?? ?? ??
Tags: import 通用 程序 動態 技術

文章來源:


ads
ads

相關文章
ads

相關文章

ad