[Unity]使用Slua框架開發(fā)創(chuàng)建Unity引擎中的對象

[Unity]技術(shù)學(xué)習(xí)路線圖(長期更新)

接上篇《[Unity]使用Slua框架開發(fā)Unity項目的重要步驟》

下載與安裝

  • 下載地址 GitHub
  • 安裝過程
    1.下載最新版,這里, 解壓縮,將Assets目錄里的所有內(nèi)容復(fù)制到你的工程中实昨,對于最終產(chǎn)品,可以刪除slua_src犀变,例子,文檔等內(nèi)容秋柄,如果是開發(fā)階段則無所謂获枝。
    2.等待unity編譯完畢,如果一切順利的話骇笔,將出現(xiàn)slua菜單省店, 點擊slua菜單中 All->Make 命令 手動生成針對當(dāng)前版本的U3d接口文件。
    3.每次更新slua版本笨触,務(wù)必記得clear all懦傍,然后make all,否則可能運行不正確

主要的內(nèi)容包括

  • LuaSvr環(huán)境對象初始化LuaState狀態(tài)機對象
  • Lua中的import關(guān)鍵字腳本中導(dǎo)入UnityEngine設(shè)置游戲?qū)ο蠼M件屬性
  • Lua中的require關(guān)鍵字導(dǎo)入自定義模塊module

創(chuàng)建新的Unity工程并且導(dǎo)入SLua框架

  • 使用已經(jīng)注入UnityEngie引擎的狀態(tài)機對象LuaSvr調(diào)用Lua腳本
    AppDelegate.cs
    using UnityEngine;
    using System.Collections;
    using SLua;
    
    public class Main : MonoBehaviour
    {
    
        private LuaSvr lua_svr;
        // Use this for initialization
        void Start()
        {
            //創(chuàng)建一個已經(jīng)注入UnityEngine的狀態(tài)機對象..
            lua_svr = new LuaSvr();
    
            //通過Resources文件夾下的main.txt(lua)文件內(nèi)的main函數(shù)啟動程序
            //當(dāng)然也可以通過修改LuaState.loaderDelegate來修改默認(rèn)的路徑
            lua_svr.start("main");
        }
    }
    
    main.txt
    funcion main()
        print("Hello LuaSvr...")
    end
    
  • main.txt文件內(nèi)導(dǎo)入UnityEngine包并且創(chuàng)建游戲?qū)ο?
    import "UnityEngine"
    
    function main()
        -- 創(chuàng)建Cube對象
        local cube=UnityEngine.GameObject.CreatePrimitive(UnityEngine.PrimitiveType.Cube)
    end
    
    
  • main.txt文件內(nèi)導(dǎo)入UnityEngine包并且創(chuàng)建空游戲?qū)ο?
    import "UnityEngine"
    
    function main()
        -- 創(chuàng)建空物體對象
        local empty=UnityEngine.GameObject("HHEmptyObject")
    end
    
    
  • 操作游戲?qū)ο笊系慕M件
    • 獲取Transform組件
      import "UnityEngine"
      
      function main()
          -- 創(chuàng)建Cube對象
          local cube=UnityEngine.GameObject.CreatePrimitive(UnityEngine.PrimitiveType.Cube)
      
          -- 獲取transform組件上的position屬性
          local pos = cube.transform.position
          pos.x = 10
      
          -- 修改transform組件的position屬性
          cube.transform.position = pos
      end
      
    • 添加Rigidbody組件
      • 導(dǎo)入import "UnityEngine"
      • 添加剛體組件cube:AddComponent(Rigidbody)
    • 獲取指定類型的組件,例如BoxCollider
      • 導(dǎo)入import "UnityEngine"
      • 自定類型字符串獲取local collider = cube:GetComponent("BoxCollider")

由于使用Lua編寫Unity項目時芦劣,無法與C#相比的是對象函數(shù)或者對象屬性的智能提示不夠健全.

所以在此貼出Slua框架中注入LuaState狀態(tài)機對象內(nèi)的一些UnityEngine的函數(shù)和屬性.

  • UnityEngine.GameObject對象在LuaState中注入的內(nèi)容
static public void reg(IntPtr l) {
        getTypeTable(l,"UnityEngine.GameObject");
        addMember(l,GetComponent);
        addMember(l,GetComponentInChildren);
        addMember(l,GetComponentInParent);
        addMember(l,GetComponents);
        addMember(l,GetComponentsInChildren);
        addMember(l,GetComponentsInParent);
        addMember(l,SetActive);
        addMember(l,CompareTag);
        addMember(l,SendMessageUpwards);
        addMember(l,SendMessage);
        addMember(l,BroadcastMessage);
        addMember(l,AddComponent);
        addMember(l,CreatePrimitive_s);
        addMember(l,FindGameObjectWithTag_s);
        addMember(l,FindWithTag_s);
        addMember(l,FindGameObjectsWithTag_s);
        addMember(l,Find_s);
        addMember(l,"transform",get_transform,null,true);
        addMember(l,"layer",get_layer,set_layer,true);
        addMember(l,"activeSelf",get_activeSelf,null,true);
        addMember(l,"activeInHierarchy",get_activeInHierarchy,null,true);
        addMember(l,"isStatic",get_isStatic,set_isStatic,true);
        addMember(l,"tag",get_tag,set_tag,true);
        addMember(l,"gameObject",get_gameObject,null,true);
        createTypeMetatable(l,constructor, typeof(UnityEngine.GameObject),typeof(UnityEngine.Object));
    }
- **只有函數(shù)指針位置的部分粗俱,在Lua中定義成了Table變量內(nèi)的函數(shù),例如:`cube:AddCommponent`**
- **在函數(shù)指針名的末尾部分以`_s`結(jié)尾的,在Lua中定義成了元表變量內(nèi)的函數(shù)虚吟,例如:`GameObject.CreatePrimitive`**
- **在添加成員時寸认,包含了類似于`"transform"`字符串的签财,在Lua中定義成了Table變量內(nèi)的鍵值對屬性,例如:`cube.transform`**
  • UnityEngine.Transform對象在LuaState中注入的內(nèi)容
        static public void reg(IntPtr l) {
        getTypeTable(l,"UnityEngine.Transform");
        addMember(l,SetParent);
        addMember(l,Translate);
        addMember(l,Rotate);
        addMember(l,RotateAround);
        addMember(l,LookAt);
        addMember(l,TransformDirection);
        addMember(l,InverseTransformDirection);
        addMember(l,TransformVector);
        addMember(l,InverseTransformVector);
        addMember(l,TransformPoint);
        addMember(l,InverseTransformPoint);
        addMember(l,DetachChildren);
        addMember(l,SetAsFirstSibling);
        addMember(l,SetAsLastSibling);
        addMember(l,SetSiblingIndex);
        addMember(l,GetSiblingIndex);
        addMember(l,Find);
        addMember(l,IsChildOf);
        addMember(l,FindChild);
        addMember(l,GetChild);
        addMember(l,"position",get_position,set_position,true);
        addMember(l,"localPosition",get_localPosition,set_localPosition,true);
        addMember(l,"eulerAngles",get_eulerAngles,set_eulerAngles,true);
        addMember(l,"localEulerAngles",get_localEulerAngles,set_localEulerAngles,true);
        addMember(l,"right",get_right,set_right,true);
        addMember(l,"up",get_up,set_up,true);
        addMember(l,"forward",get_forward,set_forward,true);
        addMember(l,"rotation",get_rotation,set_rotation,true);
        addMember(l,"localRotation",get_localRotation,set_localRotation,true);
        addMember(l,"localScale",get_localScale,set_localScale,true);
        addMember(l,"parent",get_parent,set_parent,true);
        addMember(l,"worldToLocalMatrix",get_worldToLocalMatrix,null,true);
        addMember(l,"localToWorldMatrix",get_localToWorldMatrix,null,true);
        addMember(l,"root",get_root,null,true);
        addMember(l,"childCount",get_childCount,null,true);
        addMember(l,"lossyScale",get_lossyScale,null,true);
        addMember(l,"hasChanged",get_hasChanged,set_hasChanged,true);
        createTypeMetatable(l,null, typeof(UnityEngine.Transform),typeof(UnityEngine.Component));
    }
    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末偏塞,一起剝皮案震驚了整個濱河市唱蒸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌烛愧,老刑警劉巖油宜,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件掂碱,死亡現(xiàn)場離奇詭異怜姿,居然都是意外死亡,警方通過查閱死者的電腦和手機疼燥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門沧卢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人醉者,你說我怎么就攤上這事但狭。” “怎么了撬即?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵立磁,是天一觀的道長。 經(jīng)常有香客問我剥槐,道長唱歧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任粒竖,我火速辦了婚禮颅崩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蕊苗。我一直安慰自己沿后,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布朽砰。 她就那樣靜靜地躺著尖滚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瞧柔。 梳的紋絲不亂的頭發(fā)上熔掺,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天,我揣著相機與錄音非剃,去河邊找鬼置逻。 笑死,一個胖子當(dāng)著我的面吹牛备绽,可吹牛的內(nèi)容都是我干的券坞。 我是一名探鬼主播鬓催,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼恨锚!你這毒婦竟也來了宇驾?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤猴伶,失蹤者是張志新(化名)和其女友劉穎课舍,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體他挎,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡筝尾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了办桨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片筹淫。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖呢撞,靈堂內(nèi)的尸體忽然破棺而出损姜,到底是詐尸還是另有隱情,我是刑警寧澤殊霞,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布摧阅,位于F島的核電站,受9級特大地震影響绷蹲,放射性物質(zhì)發(fā)生泄漏棒卷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一瘸右、第九天 我趴在偏房一處隱蔽的房頂上張望娇跟。 院中可真熱鬧,春花似錦太颤、人聲如沸苞俘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吃谣。三九已至,卻和暖如春做裙,著一層夾襖步出監(jiān)牢的瞬間岗憋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工锚贱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留仔戈,地道東北人。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像监徘,于是被迫代替她去往敵國和親晋修。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容