[Unity]使用Slua框架開發(fā)Unity項(xiàng)目的重要步驟

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

下載與安裝

  • 下載地址 GitHub
  • 安裝過程
    1.下載最新版,這里, 解壓縮霹期,將Assets目錄里的所有內(nèi)容復(fù)制到你的工程中,對(duì)于最終產(chǎn)品拯田,可以刪除slua_src历造,例子,文檔等內(nèi)容船庇,如果是開發(fā)階段則無所謂吭产。
    2.等待unity編譯完畢,如果一切順利的話鸭轮,將出現(xiàn)slua菜單臣淤, 點(diǎn)擊slua菜單中 All->Make 命令 手動(dòng)生成針對(duì)當(dāng)前版本的U3d接口文件。
    3.每次更新slua版本窃爷,務(wù)必記得clear all邑蒋,然后make all姓蜂,否則可能運(yùn)行不正確

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

  • LuaState狀態(tài)機(jī)對(duì)象執(zhí)行Lua字符串
  • LuaState狀態(tài)機(jī)對(duì)象執(zhí)行Lua腳本
  • LuaState狀態(tài)機(jī)對(duì)象調(diào)用Lua腳本內(nèi)的自定義函數(shù)
  • LuaState狀態(tài)機(jī)對(duì)象注冊(cè)C#自定義類
  • Lua腳本中調(diào)用C#中的自定義類

創(chuàng)建第一個(gè)可以使用Slua框架的Unity項(xiàng)目

  • MainCamera對(duì)象上創(chuàng)建AppDelegate.cs組件

    using UnityEngine;
    using System.Collections;
    
    public class AppDelegate : MonoBehaviour 
    {
        void Start () 
        {
            //在下方添加初始化代碼
        }
    }
    
  • 使用LuaState狀態(tài)機(jī)對(duì)象執(zhí)行Lua字符串

    using UnityEngine;
    using System.Collections;
    using SLua;
    
    public class AppDelegate : MonoBehaviour 
    {
        private static LuaState  ls_state = new LuaState();
        void Start () 
        {
            //在下方添加初始化代碼
            ls_state.doString("print(\"Hello Lua!\")");
        }
    }
    
  • 使用LuaState狀態(tài)機(jī)對(duì)象執(zhí)行Lua腳本文件HelloLua.lua

    • Resources文件夾下添加HelloLua.lua文件

      print("Lua Scripts:Hello");
      
    • AppDelegate.cs中設(shè)置LuaState.loaderDelegate啟動(dòng)文件委托代理

      using UnityEngine;
      using System.Collections;
      using SLua;
      using System.IO;
      
      public class AppDelegate : MonoBehaviour 
      {
      void Start () 
      {
          //設(shè)置腳本啟動(dòng)代理
          LuaState.loaderDelegate = ((string fn) => {
              //獲取Lua文件執(zhí)行目錄
              string file_path = Directory.GetCurrentDirectory() + "/Assets/Resources/" + fn;
      
              Debug.Log(file_path);
      
              return File.ReadAllBytes(file_path);
          });
      }
      }
      
    • AppDelegate.cs中通過LuaState對(duì)象執(zhí)行HelloLua.lua腳本

      using UnityEngine;
      using System.Collections;
      using SLua;
      using System.IO;
      
      public class AppDelegate : MonoBehaviour 
      {
      
          void Start () 
          {
              //設(shè)置腳本啟動(dòng)代理
              LuaState.loaderDelegate = ((string fn) => {
                  //獲取Lua文件執(zhí)行目錄
                  string file_path = Directory.GetCurrentDirectory() + "/Assets/Resources/" + fn;
      
                  Debug.Log(file_path);
      
                  return File.ReadAllBytes(file_path);
              });
      
              //設(shè)置執(zhí)行腳本
              LuaState ls_state = new LuaState ();
              ls_state.doFile ("HelloLua.lua");
          }
      }
      
  • 通過LuaState對(duì)象獲取并執(zhí)行HelloLua.lua腳本中的一個(gè)函數(shù)

    • HelloLua.lua

      function sum( v1,v2 )
          -- body
          return v1 + v2
      end
      
      function mul( v1,v2 )
          -- body
          return v1 * v2
      end
      
    • AppDelegate.cs

      using UnityEngine;
      using System.Collections;
      using SLua;
      using System.IO;
      using LuaInterface;
      using System;
      
      public class AppDelegate : MonoBehaviour 
      {
          //添加LuaState初始化時(shí)的回調(diào)函數(shù)特性函數(shù)
          [MonoPInvokeCallbackAttribute(typeof(LuaCSFunction))]
          static int init(IntPtr L)
          {
              //設(shè)置初始化LuaObject對(duì)象
              LuaObject.init(L);
              return 0;
          }
      
          void Start () 
          {
              //創(chuàng)建狀態(tài)機(jī)對(duì)象
              LuaState ls_state = new LuaState ();
      
              //設(shè)置腳本啟動(dòng)代理
              LuaState.loaderDelegate = ((string fn) => {
                  //獲取Lua文件執(zhí)行目錄
                  string file_path = Directory.GetCurrentDirectory() + "/Assets/Resources/" + fn;
      
                  Debug.Log(file_path);
      
                  return File.ReadAllBytes(file_path);
              });
          
              //初始化LuaState狀態(tài)機(jī)與C#的轉(zhuǎn)換對(duì)象
              LuaState.pcall (ls_state.L, init);
      
              //設(shè)置狀態(tài)機(jī)對(duì)象的執(zhí)行腳本
              ls_state.doFile ("HelloLua.lua");
      
              //獲取腳本中的mul函數(shù)
              LuaFunction mul = ls_state.getFunction ("mul");
      
              //調(diào)用該函數(shù)并且接收返回值
              double result = (double)mul.call (-2, 3);
      
              Debug.Log(result);
          }
      }
      
  • 自定義C#對(duì)象LOHuman.cs,在HelloLua.lua

    • LOHuman.cs
    using System;
    using LuaInterface;
    using SLua;
    //該特性可以修飾以下類將會(huì)注冊(cè)到Slua執(zhí)行環(huán)境中
    [CustomLuaClass]
    public class HHHuman
    {
        //年齡成員
        protected int age = 0;
        //姓名成員
        protected string name = "";
        
        //添加Lua代碼中的靜態(tài)函數(shù)
        [MonoPInvokeCallbackAttribute(typeof(LuaCSFunction))]
        [StaticExport]
        public static int CreateHuman(IntPtr l)
        {
            HHHuman item = new HHHuman ();
            LuaObject.pushObject (l, item);
            //只執(zhí)行了1次LuaObject.push,返回值寫1
            return 1;
        }
    
        public int Age {
            set;
            get;
        }
    
        public string Name{ set; get; }
    }
    
    • 通過點(diǎn)擊菜單欄中的SLua->Custom->Clear將舊版本的自定義類刪除
    • 通過點(diǎn)擊菜單欄中的SLua->Custom->Make重新制作適用于SLua的新的自定義類Lua_HHHuman.cs
      • 默認(rèn)存放目錄Assets->SLua->LuaObject->Custom->
    • 同時(shí)會(huì)自動(dòng)生成一個(gè)BindCustom.cs類医吊,代碼如下:
    using System;
    namespace SLua {
        [LuaBinder(3)]
        public class BindCustom {
            public static void Bind(IntPtr l) {
                Lua_HHHuman.reg(l);
                Lua_System_Collections_Generic_List_1_int.reg(l);
                Lua_System_Collections_Generic_Dictionary_2_int_string.reg(l);
                Lua_System_String.reg(l);
            }
        }
    }
    
    • AppDelegate.csinit函數(shù)中,綁定自定義類HHHuman.cs
    //添加LuaState初始化時(shí)的回調(diào)函數(shù)特性函數(shù)
    [MonoPInvokeCallbackAttribute(typeof(LuaCSFunction))]
    static int init(IntPtr L)
    {
        LuaObject.init(L);
        BindCustom.Bind (L);
        return 0;
    }
    
    • HelloLua.lua腳本中,調(diào)用C#中的自定義類的靜態(tài)函數(shù)CreateHuman()
    function testHuman()
        -- body
        local human = HHHuman.CreateHuman()
        -- local list = human:getList()
        print(human.Age)
    end
    
    • AppDelegate.csStart函數(shù)中钱慢,調(diào)用HelloLua.lua腳本中的testHuman函數(shù)
    static LuaState ls_state;
    void Start () 
    {
        //創(chuàng)建狀態(tài)機(jī)對(duì)象
        ls_state = new LuaState ();
    
        //設(shè)置腳本啟動(dòng)代理
        LuaState.loaderDelegate = ((string fn) => {
            //獲取Lua文件執(zhí)行目錄
            string file_path = Directory.GetCurrentDirectory() + "/Assets/Resources/" + fn;
    
            Debug.Log(file_path);
    
            return File.ReadAllBytes(file_path);
        });
    
        //初始化LuaState狀態(tài)機(jī)與C#的轉(zhuǎn)換對(duì)象
        LuaState.pcall (ls_state.L, init);
    
        //設(shè)置執(zhí)行腳本
        ls_state.doFile ("HelloLua.lua");
        
        //獲取testHuman函數(shù)
        LuaFunction testHuman = ls_state.getFunction ("testHuman");
    
        //無參函數(shù)的調(diào)用
        testHuman.call ();
    }
    

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

  • LuaState狀態(tài)機(jī)對(duì)象執(zhí)行Lua字符串
  • LuaState狀態(tài)機(jī)對(duì)象執(zhí)行Lua腳本
  • LuaState狀態(tài)機(jī)對(duì)象調(diào)用Lua腳本內(nèi)的自定義函數(shù)
  • LuaState狀態(tài)機(jī)對(duì)象注冊(cè)C#自定義類
  • Lua腳本中調(diào)用C#中的自定義類

今天先寫到這里,明天繼續(xù)

創(chuàng)建第一個(gè)可以使用Slua框架調(diào)用UnityEngine的Unity項(xiàng)目..
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末卿堂,一起剝皮案震驚了整個(gè)濱河市束莫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌御吞,老刑警劉巖麦箍,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異陶珠,居然都是意外死亡挟裂,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門揍诽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來诀蓉,“玉大人,你說我怎么就攤上這事暑脆∏。” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵添吗,是天一觀的道長(zhǎng)沥曹。 經(jīng)常有香客問我,道長(zhǎng)碟联,這世上最難降的妖魔是什么妓美? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮鲤孵,結(jié)果婚禮上壶栋,老公的妹妹穿的比我還像新娘。我一直安慰自己普监,他們只是感情好贵试,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著凯正,像睡著了一般毙玻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上漆际,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天淆珊,我揣著相機(jī)與錄音,去河邊找鬼奸汇。 笑死施符,一個(gè)胖子當(dāng)著我的面吹牛往声,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播戳吝,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼浩销,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了听哭?” 一聲冷哼從身側(cè)響起慢洋,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎陆盘,沒想到半個(gè)月后普筹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡隘马,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年太防,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片酸员。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蜒车,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出幔嗦,到底是詐尸還是另有隱情酿愧,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布邀泉,位于F島的核電站嬉挡,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏汇恤。R本人自食惡果不足惜棘伴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望屁置。 院中可真熱鬧,春花似錦仁连、人聲如沸蓝角。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽使鹅。三九已至,卻和暖如春昌抠,著一層夾襖步出監(jiān)牢的瞬間患朱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工炊苫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留裁厅,地道東北人冰沙。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像执虹,于是被迫代替她去往敵國(guó)和親拓挥。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

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