[Unity]Editor拡張でBuildをする

  • 1
    いいね
  • 0
    コメント

概要

前回Editor拡張でPlayerSettingの値をいじるで独自のウィンドウからいろいろ編集できるようにしたので、今回はEditor拡張で独自のウィンドウを使ってBuildしていきたいと思います。
「UnityEditor拡張ってなに?」って方は前回の記事をご覧ください。

必要最低限のGUI

ここではプラットフォームの選択とBuildする際の名前を変更できるGUI作成します。

BuildSetting.cs
using UnityEditor;
using System.Collections;
using System.Collections.Generic;
using System.IO;

public class BuildSetting : EditorWindow {

    //対象プラットフォーム
    int buildTypeNum;

    //フォルダネーム
    string buildName = PlayerSettings.productName;

    //ポップアップ用変数
    private static string[] BuildTypes = { 
        "MAC OS X",     //0
        "Windows",      //1
        "WebPlayer",    //2
        "iOS",          //3
        "Android"       //4
    };

    [MenuItem("KitouSpecial/BuildSetting")]
    static void Open( ) {
        EditorWindow.GetWindow<BuildSetting>( "BuildSetting" );
    }

    void OnGUI( ) {

        //対象プラットフォーム選択
        buildTypeNum = EditorGUILayout.Popup("BuildType", buildTypeNum, BuildTypes);

        //フォルダネーム
        buildName = EditorGUILayout.TextField ("フォルダネーム", buildName);
    }
}

プラットフォームに関してはポップアップを使用して選択できるようにしています。これに関してはもっと楽な方法があると思いますが、この方法以外知らないのでこのやり方でいきます。
プラットフォームはもちろんまだまだありますが、ここでは代表的な5つを使っていきます。

スクリーンショット 2016-11-19 13.57.09.png

こういう風になりました。

出力先を決めよう

BuildSetting.cs
//ビルド開始ボタン
    if (GUILayout.Button ("Build")) {
        //ビルド先
        string path = EditorUtility.OpenFolderPanel ("Build", "", "");
        string[] files = Directory.GetFiles (path);

        //名前がない場合に値を入れる。
        if ( buildName == "" ) {
            buildName = PlayerSettings.productName;
        }

        //ビルド
}

これをOnGUIの中に入れます。
ボタンを作り、EditorUtility.OpenFolderPanelでファイルブラウザでpathに出力先を入れます。

ビルドをしてみる

まずはWindowsのみでビルドしていきたいと思います。
ここで追加したのはシーンリスト取得の関数を作成し、実際にビルドを走らせてます。

BuildSetting.cs
using UnityEngine;
using UnityEditor;
using System.Collections;
using System.Collections.Generic;
using System.IO;

public class BuildSetting : EditorWindow {

    //対象プラットフォーム
    int buildTypeNum;

    //フォルダネーム
    string buildName = PlayerSettings.productName;

    //ポップアップ用変数
    private static string[] BuildTypes = { 
        "MAC OS X",     //0
        "Windows",      //1
        "WebPlayer",    //2
        "iOS",          //3
        "Android"       //4
    };

    [MenuItem("KitouSpecial/BuildSetting")]
    static void Open( ) {
        EditorWindow.GetWindow<BuildSetting>( "BuildSetting" );
    }

    void OnGUI( ) {

        //対象プラットフォーム選択
        buildTypeNum = EditorGUILayout.Popup("BuildType", buildTypeNum, BuildTypes);

        //フォルダネーム
        buildName = EditorGUILayout.TextField ("フォルダネーム", buildName);

        //ビルド開始ボタン
        if (GUILayout.Button ("Build")) {
            //ビルド先
            string path = EditorUtility.OpenFolderPanel ("Build", "", "");
            string[] files = Directory.GetFiles (path);


            //名前がない場合に値を入れる。
            if ( buildName == "" ) {
                buildName = PlayerSettings.productName;
            }

            // ビルド
            string errorMessage = BuildPipeline.BuildPlayer(
                GetEnabledScenes( ),                // ビルド対象シーンリスト
                path + "/" + buildName + ".exe",    // 出力先
                BuildTarget.StandaloneOSXUniversal, // ビルド対象プラットフォーム
                BuildOptions.Development            // ビルドオプション
            );
        }
    }

    //シーンリスト取得
    static string[] GetEnabledScenes( ) {
        List<string> sceneList = new List<string>();

        // "Scenes In Build"に登録されているシーンリストを取得
        EditorBuildSettingsScene[] scenes = EditorBuildSettings.scenes;
        foreach( EditorBuildSettingsScene scene in scenes ) {
            // チェックがついているか確認
            if( scene.enabled ) {
                // リストに加える
                sceneList.Add( scene.path );
            }
        }

        // 配列にして返す
        return sceneList.ToArray();
    }

BuildPipeline.BuildPlayer この関数でビルドを走らせることができます。
第三引数 BuildTargetリファレンス → BuildTarget
第四引数 BuildOptionsリファレンス → BuildOptions

プラットフォームを選択(完成)

BuildSetting.cs
#プラットフォームを選択(完成)

using UnityEngine;
using UnityEditor;
using System.Collections;
using System.Collections.Generic;
using System.IO;

public class BuildSetting : EditorWindow {

    //対象プラットフォーム
    int buildTypeNum;

    //フォルダネーム
    string buildName = PlayerSettings.productName;

    //ポップアップ用変数
    private static string[] BuildTypes = { 
        "MAC OS X",     //0
        "Windows",      //1
        "WebPlayer",    //2
        "iOS",          //3
        "Android"       //4
    };

    [MenuItem("KitouSpecial/BuildSetting")]
    static void Open( ) {
        EditorWindow.GetWindow<BuildSetting>( "BuildSetting" );
    }

    void OnGUI( ) {

        //対象プラットフォーム選択
        buildTypeNum = EditorGUILayout.Popup("BuildType", buildTypeNum, BuildTypes);

        //フォルダネーム
        buildName = EditorGUILayout.TextField ("フォルダネーム", buildName);

        //ビルド開始ボタン
        if (GUILayout.Button ("Build")) {
            //ビルド先
            string path = EditorUtility.OpenFolderPanel ("Build", "", "");
            string[] files = Directory.GetFiles (path);


            //名前がない場合に値を入れる。
            if ( buildName == "" ) {
                buildName = PlayerSettings.productName;
              }

            // ビルド
            BuildPlatform(buildTypeNum, path  );
        }
    }

    //シーンリスト取得
    static string[] GetEnabledScenes( ) {
        List<string> sceneList = new List<string>();

        // "Scenes In Build"に登録されているシーンリストを取得
        EditorBuildSettingsScene[] scenes = EditorBuildSettings.scenes;
        foreach( EditorBuildSettingsScene scene in scenes ) {
            // チェックがついているか確認
            if( scene.enabled ) {
                // リストに加える
                sceneList.Add( scene.path );
            }
        }

        // 配列にして返す
        return sceneList.ToArray();
    }

    //ビルドプラットフォーむ
    void BuildPlatform( int num, string path ) {
        if (num == 0) {
            //Windows
            string errorMessage = BuildPipeline.BuildPlayer(
                GetEnabledScenes( ),                // ビルド対象シーンリスト
                path + "/" + buildName + ".exe",    // 出力先
                BuildTarget.StandaloneOSXUniversal, // ビルド対象プラットフォーム
                BuildOptions.Development            // ビルドオプション
            );
        } else if (num == 1) {
            //MacOS
            string errorMessage = BuildPipeline.BuildPlayer(
                GetEnabledScenes( ),                // ビルド対象シーンリスト
                path + "/" + buildName + ".exe",    // 出力先
                BuildTarget.StandaloneWindows,      // ビルド対象プラットフォーム
                BuildOptions.Development            // ビルドオプション
            );
        } else if (num == 2) {
            //Webプレイヤー
            string errorMessage = BuildPipeline.BuildPlayer(
                GetEnabledScenes( ),                // ビルド対象シーンリスト
                path + "/" + buildName,             // 出力先
                BuildTarget.WebPlayer,              // ビルド対象プラットフォーム
                BuildOptions.Development            // ビルドオプション
            );
        } else if (num == 3) {
            //iOS
            string errorMessage = BuildPipeline.BuildPlayer(
                GetEnabledScenes( ),                // ビルド対象シーンリスト
                path + "/" + buildName,             // 出力先
                BuildTarget.iOS,                    // ビルド対象プラットフォーム
                BuildOptions.Development            // ビルドオプション
            );
        } else if (num == 4) {
            //Android
            string errorMessage = BuildPipeline.BuildPlayer(
                GetEnabledScenes( ),                // ビルド対象シーンリスト
                path + "/" + buildName + ".apk",    // 出力先
                BuildTarget.Android,                // ビルド対象プラットフォーム
                BuildOptions.Development            // ビルドオプション
            );
        }

    }
}

スクリーンショット 2016-11-19 14.51.19.png

すごく強引なやり方ですが、プラットフォーム別でビルドできました。

注意
buildNameに何も入ってなく、出力先が.../Desktopなどで終わっているとデスクトップ上のものが全て消えるなど大変なことが起きるので気をつけて下さい。

終わり
これだけでは、全く意味のないウィンドウですが、応用すれば色々なことができそうです。

参考

コマンドラインからUnityのビルドを走らせる。 -基礎編-