1. 程式人生 > >實力封裝:Unity打包AssetBundle(大結局)

實力封裝:Unity打包AssetBundle(大結局)

函數返回 can width ldo 用戶輸入 sts leo ati 就是

→→前情提要:讓用戶選擇要打包的文件←←

大結局:更多選擇

Unity打包AssetBundle從入門到放棄系列終於要迎來大結局了【小哥哥表示實在寫不動了o(╥﹏╥)o】...

經過上一次的教程,其實整個打包的功能也就差不多完成了,只是我們還沒加上打包的按鈕。這幾次我們會加上打包和取消的按鈕,並且開放更多的選項。

開始之前我們再來看看BuildAssetBundles函數的定義↓↓

  public static AssetBundleManifest BuildAssetBundles(string outputPath, BuildAssetBundleOptions assetBundleOptions, BuildTarget targetPlatform);
  Parameters

在這個函數中,最後兩個參數規定了打包時采用的壓縮方式以及目標平臺,我們可以將這兩個選項公開出來,供用戶選擇。

BuildAssetBundleOptions和BuildTarget都是枚舉類型的變量,我們可以提供一個下拉按鈕,讓用戶自由選擇。EditorGUILayout.EnumPopup方法恰好可以實現這一功能,它需要一個枚舉類型的參數,並且自動將該枚舉類型的所有選項變成下拉按鈕,所以首先我們需要定義兩個枚舉類型的字段↓↓

  private BuildAssetBundleOptions buildOption = BuildAssetBundleOptions.None;
      private BuildTarget targetPlatform = BuildTarget.StandaloneWindows64;

然後在OnGUI函數中添加如下代碼↓↓

  buildOption = (BuildAssetBundleOptions)EditorGUILayout.EnumPopup ("Build Option:", buildOption);
  targetPlatform = (BuildTarget)EditorGUILayout.EnumPopup ("Build Platform:", targetPlatform);

註意,函數返回值要進行類型轉換,第一個參數表示下拉框前面的文字提示。
技術分享圖片

在第二篇教程:第二種打包方式中,我們寫了兩個打包函數,表示兩種不同的打包方式。一是將選中的文件分開打包,二是將選中文件打進一個包,我們也可以自定義一個枚舉類型來表示這兩種不同的打包方式,已提供更靈活的選擇。

首先定義枚舉類型和枚舉變量↓↓

  enum PackageStyle {
      BUILD_ALL_IN_ONE_FOLDER,    //分開打包
      BUILD_ALL_IN_AN_ASSETBUNDLE,//打進一個包
  };
  private PackageStyle style = PackageStyle.BUILD_ALL_IN_EACH_FOLDER;
  private string packageName;

然後往OnGUI函數中添加如下代碼↓↓

  
  GUILayout.Space (10);
  GUILayout.BeginVertical (GUILayout.Height(50));
  style = (PackageStyle)EditorGUILayout.EnumPopup ("Package Style:", style);
  if (style == PackageStyle.BUILD_ALL_IN_AN_ASSETBUNDLE) {
      packageName = EditorGUILayout.TextField ("Package Name:", packageName);
  }
  GUILayout.EndVertical ();

這裏我們還判斷了一下打包方式,如果是所有文件打進一個包的話,提供一個文本框讓用戶輸入包的名字,因為我們也不知道把哪一個文件的名字作為包的名字合適。
技術分享圖片

現在只剩最後一步打包了,我們提供兩個按鈕,一個叫打包,一個叫取消。如果取消被點擊,就直接關閉窗口;如果打包被點擊,就根據用戶選擇的打包方式,調用對應的函數進行打包,完成以後關閉窗口。我們繼續在OnGUI函數中添加代碼↓↓

  
  GUILayout.BeginHorizontal ();
  if (GUILayout.Button ("取消",  GUILayout.Width(80))) {
      this.Close ();
  }
  if (GUILayout.Button ("打包",  GUILayout.Width(80))) {
      bool canPackage = true;
      if (packagePath == null || packagePath.Length <= 0 || !Directory.Exists (packagePath)) {
          canPackage = false;
          EditorApplication.Beep ();
      }
      List<string> selectedAssets = new List<string> ();
      int count = 0;
      foreach (var go in assetsPath) {
          if (flags [count])
              selectedAssets.Add (go);
              ++count;
          }
      if (selectedAssets == null || selectedAssets.Count <= 0) {
          canPackage = false;
          EditorApplication.Beep ();
      }
      if (canPackage) {
          switch (style) {
          case PackageStyle.BUILD_ALL_IN_ONE_FOLDER:
          {
              BuildAssetsInOneFolder (packagePath, selectedAssets.ToArray ());
              break;
          }
          case PackageStyle.BUILD_ALL_IN_AN_ASSETBUNDLE:
          {
              BuildAssetsInOneBundle (packagePath, selectedAssets.ToArray ());
              break;
          }
          default: { break; }
          }
      this.Close ();
      }
  }
  GUILayout.EndHorizontal ();

點擊打包按鈕的時候復雜一點,我們一一來說明↓↓

首先有一個bool標誌,表示是否可以打包。有兩種情況下是不能進行打包的:

  • 用戶給出的打包路徑為空或不存在;

  • 用戶未選擇任何資源文件

針對以上兩種情況,我們將標誌位設為false,這樣就不會運行打包的函數了。EditorApplication.Beep ()可以讓系統發出“叮”的一聲,提示用戶出錯了。

另外,我們還需要將用戶選擇的文件都給摘出來。也就是需要遍歷AssetsPath鏈表,將flags數組中值為true的下標對應的文件路徑添加到一個新的鏈表中。如果這個鏈表為空,則表示用戶未選擇任何文件。

如果標誌位(canPackage)為true,則表示可以進行打包。首先需要判斷一下用戶選擇的打包方式,然後分別調用不同的打包函數。最後打包結束後,調用Close()方法關閉窗口。

需要註意的是這裏用到的打包函數和第二篇教程裏的那兩個打包函數有點不一樣了,為了適應新的參數,我們做了一點小小的改動,核心的部分沒有任何變化,只是參數傳入的方式變了,相信這是難不倒你的!
技術分享圖片

那兒到這裏整個打包封裝的過程就結束了,一些細枝末節和UI布局上的事大家根據自己的喜好做就好了,感謝大家的支持!

完結撒花??ヽ(°▽°)ノ?

實力封裝:Unity打包AssetBundle(大結局)