Unityゲームフレームワーク構築(十二)簡易AssetBundleパッケージツール(二)

31083 ワード

前の文章では基本的なパッケージ機能を実現し、この文章では異なるプラットフォームでABパッケージを打つ問題を解決します.この記事のコアapiは、次のとおりです.
BuildPipeline.BuildAssetBundles (outPath, 0, EditorUserBuildSettings.activeBuildTarget);  

3番目のパラメータでは、異なるプラットフォームBuildTargetに転送すればよい.現在はAndroidとiOSプラットフォームのみを考慮しています.
iOS、Androidプラットフォームを区別します.
  簡単ですが、前述のQABEditorクラスで元のBuildAssetBundleメソッドをBuildAssetBundleiOSとBuildAssetBundleAndroidに分類すればいいです.コードは以下の通りです.
public class QABEditor  
    {
        [MenuItem("QFramework/AB/Build iOS")]
        public static void BuildABiOS()
        {
            string outputPath = QPath.ABBuildOutPutDir (RuntimePlatform.IPhonePlayer);

            QIO.CreateDirIfNotExists (outputPath);

            QABBuilder.BuildAssetBundles (BuildTarget.iOS);

            AssetDatabase.Refresh ();
        }

        [MenuItem("QFramework/AB/Build Android")]
        public static void BuildABAndroid()
        {
            string outputPath = QPath.ABBuildOutPutDir (RuntimePlatform.Android);

            QIO.CreateDirIfNotExists (outputPath);

            QABBuilder.BuildAssetBundles (BuildTarget.Android);

            AssetDatabase.Refresh ();

        }
}

コードにはいくつかのクラスがあると思います.以下、一つ一つ紹介します.
QPath.ABBuildOutPutDir(build target)
このクラスは私のフレームワークで固定されたパスを指定するために使用されています.パスのコードはすべて文字列なので、文字列をあちこちに露出させることはできません.これはコードの可読性に影響します.統一的に管理すると修正しやすい.ABBuildOutPutDirというAPIの実現は以下の通りであり,多くは言わない.
    /// 
    ///            
    /// 
    public class QPath 
    {
        /// 
        ///        
        /// 
        public static string ABBuildOutPutDir(RuntimePlatform platform) {
            string retDirPath = null;
            switch (platform) {
            case RuntimePlatform.Android:
                retDirPath = Application.streamingAssetsPath + "/QAB/Android";
                break;
            case RuntimePlatform.IPhonePlayer:
                retDirPath = Application.streamingAssetsPath + "/QAB/iOS";
                break;
            case RuntimePlatform.WindowsPlayer:
            case RuntimePlatform.WindowsEditor:
                retDirPath = Application.streamingAssetsPath + "/QAB/Windows";
                break;
            case RuntimePlatform.OSXPlayer:
            case RuntimePlatform.OSXEditor:
                retDirPath = Application.streamingAssetsPath + "/QAB/OSX";
                break;
            }

            return retDirPath;
        }

        /// 
        ///           
        /// 
        public static string SrcABDir  {
            get {
                return Application.dataPath + "/QArt/QAB";
            }
        }
    }
}

QIO.CreateDirIfNotExists (outputPath)

  QIO这个类是用来封装C#的System.IO和一些文件操作相关的API。CreateDirIfNotExists这个命名非常的傻瓜,会点英文就应该可以理解了。下面贴出实现代码,

using UnityEngine;  
using System.Collections;  
using System.IO;

/// 
///            ,    System.IO     
/// 
namespace QFramework {

    public class QIO {

        /// 
        ///        ,        
        /// 
        public static void CreateDirIfNotExists(string dirFullPath)
        {
            if (!Directory.Exists (dirFullPath)) {
                Directory.CreateDirectory (dirFullPath);
            }
        }
    }
}

QABBuilder

  QABBuilder只是封装了本文的核心API

BuildPipeline.BuildAssetBundles (outPath, 0, EditorUserBuildSettings.activeBuildTarget);  

  パッケージの原因は、ABパッケージが成功した後、パケットサイズの計算、ハッシュまたはmd 5値の計算など、ABパッケージに対していくつかの処理を行うことである.主に今後の熱更新のために準備しています.QCBuilderコアの実現を見てみましょう.
    public class QABBuilder
    {
        public static string overloadedDevelopmentServerURL = "";


        public static void BuildAssetBundles(BuildTarget buildTarget)
        {
            string outputPath = Path.Combine(QPlatform.ABundlesOutputPath,  QPlatform.GetPlatformName());

            if (Directory.Exists (outputPath)) {
                Directory.Delete (outputPath,true);
            }
            Directory.CreateDirectory (outputPath);

            BuildPipeline.BuildAssetBundles(outputPath,BuildAssetBundleOptions.None,buildTarget);

            GenerateVersionConfig (outputPath);
            if(Directory.Exists(Application.streamingAssetsPath+"/QAB")){
                Directory.Delete (Application.streamingAssetsPath+"/QAB",true);
            }
            Directory.CreateDirectory (Application.streamingAssetsPath+"/QAB");
            FileUtil.ReplaceDirectory (QPlatform.ABundlesOutputPath,Application.streamingAssetsPath+"/QAB");
            AssetDatabase.Refresh ();
        }
    }
}

使用方法
(iOSフォルダが作成されています)
紹介が終わり、寝ました!