(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

ビルド時にプラットフォームに合わせてAssetBundleを移動する【Unity】【AssetBundle】【エディタ拡張】


このエントリーをはてなブックマークに追加


この記事でのバージョン

Unity 2017.2.0f3


はじめに

AssetBundleをローカルで使いたい場合は

StreamingAssetsというディレクトリに配置すると使い易いです。

StreamingAssets と呼ばれるフォルダーに配置したファイルはビルド先のプラットフォームの、特定のフォルダーにそのまま何も変換されない状態で保持されます。


ただし、StreamingAssetsに配置したファイルは全てビルドに含まれてしまいます。

AssetBundleはプラットフォームごとに作成しなければならないので、

全AssetBundleをStreamingAssetsに配置してしまうと、

プラットフォームの分だけ容量が増える事になってしまいます。


なので今回は、ビルド時にプラットフォームに合わせてAssetBundleを移動する方法のご紹介です!

当たり前ですが、エディタ上と実機でAssetBundleの位置が変わるため注意が必要です。


まぁ、エディタ上ではResources外からもファイルは読み込めるので、

エディタ上ではAssetBundleを使わないようにした方が楽です。



なお、以前に同じような話で

Resourcesにあるファイルをビルド時にのみ移動する方法というのも紹介してました。





AssetBundleMover

実装方法は、

ビルドする前に実行されるOnPreprocessBuildでファイルを移動し、

ビルドした後に実行されるOnPostprocessBuildで移動したファイルを戻すだけです。


なお、OnPreprocessBuildはUnity5.6から機能なので、注意が必要です。


実際にプログラムにしてみると以下のような感じに。



上記のAssetBundleMover.csをEditor上に作成すると、

ビルド時にStreamingAssetsディレクトリを作成し、

Asset/AssetBundles/プラットフォーム名 にある全ファイルを自動で移動するようになります。


f:id:kan_kikuchi:20171014171826j:plain


さらにビルド後には全ファイルを元に戻し、StreamingAssetsディレクトリを削除します。


なお、対象のプラットフォームのディレクトリが無い場合はエラーが表示されます。


f:id:kan_kikuchi:20171014171142j:plain


Unityエディタ上で見ても移動したか分からないので、Finderで確認すると、


f:id:kan_kikuchi:20171014174542g:plain


ばっちり移動していますね……!


余談ですが、プラットフォームごとにAssetBundleを書き出す時は以下のような感じで

BuildPipeline.BuildAssetBundlesをプラットフォームの数だけ実行します。

//AssetBundleを生成
[MenuItem("Tools/Create/Asset Bundle")]
public static void Create(){
  CreateAssetBundles(BuildTarget.StandaloneOSXUniversal);
  CreateAssetBundles(BuildTarget.StandaloneOSXIntel64);
  CreateAssetBundles(BuildTarget.StandaloneWindows64);
  CreateAssetBundles(BuildTarget.StandaloneLinuxUniversal);
  CreateAssetBundles(BuildTarget.StandaloneLinux64);
}

//指定したプラットフォームのAssetBundleを書き出す
private static void CreateAssetBundles(BuildTarget buildTarget){
  //プラットフォームのディレクトリがなければ作成
  string directoryPath = "Assets/AssetBundles/" + buildTarget.ToString();
  if (!Directory.Exists(directoryPath)){
    Directory.CreateDirectory(directoryPath);
  }

 //AssetBundle書き出し
  BuildPipeline.BuildAssetBundles (directoryPath, BuildAssetBundleOptions.None, buildTarget);
}


対象のプラットフォームやAssetBundleが増えるほど、ビルド時間がどんどん増えていくので、

そういう意味でもエディタ上ではAssetBundleを使わないようにした方が楽です。