コード例 #1
0
 private void GenerateShellScriptFile()
 {
     using (var fs = new FileStream($"{ShellScriptGeneratorConstants.GetProjectParentPath()}/BuildShell.sh",
                                    FileMode.Create))
     {
         using (var sw = new StreamWriter(fs))
         {
             sw.Write(
                 "#!/bin/sh\n" +
                 ". ./buildSetting.txt\n" +
                 "echo \"//// $PROJECT_NAME BuildStart ////\"\n" +
                 "echo \"\"\n" +
                 "mkdir -p ./$PROJECT_NAME/Build/\n" +
                 "echo \"//// Build Parameters ////\"\n" +
                 "echo \"\"\n" +
                 "echo UnityPath : $1\n" +
                 "echo WorkSpacePath : $2\n" +
                 "echo TargetPlatform : $TARGET_PLATFORM\n" +
                 "echo ApplicationName : $APPLICATION_NAME\n" +
                 "echo BuildCommand : $BUILD_COMMAND\n" +
                 "echo Run : $1 $BUILD_COMMAND\n" +
                 "echo \"\"\n" +
                 "echo \"/////////////////////////\"\n" +
                 "$1 $BUILD_COMMAND"
                 );
         }
     }
 }
コード例 #2
0
    public static void Build()
    {
        var  output        = "";
        var  platform      = BuildTarget.StandaloneWindows64;
        var  sceneSetting  = new SceneBuildSetting();
        bool isDevelopment = false;
        var  args          = System.Environment.GetCommandLineArgs();

        for (int i = 0; i < args.Length; i++)
        {
            switch (args[i])
            {
            case "-outputPath":
                output = args[i + 1];
                break;

            case "-platform":
                platform = (BuildTarget)Enum.Parse(typeof(BuildTarget), args[i + 1]);
                break;

            case "-sceneSet":
                sceneSetting = GetSceneBuildSetting(args[i + 1]);
                break;

            case "-development":
                isDevelopment = true;       //Developmentビルドにする
                break;

            default:
                break;
            }
        }

        var option = new BuildPlayerOptions();

        option.locationPathName = output;
        Debug.Log($"Output path = {output}");

        if (isDevelopment)
        {
            //optionsはビットフラグなので、|で追加していくことができる
            option.options = BuildOptions.Development | BuildOptions.AllowDebugging;
        }

        option.target = platform;

        //sceneSetting.jsonが引数に入ってなかったらProjectRootの親から持ってくる
        if (sceneSetting.sceneNames.Count == 0)
        {
            sceneSetting =
                GetSceneBuildSetting(
                    $"{ShellScriptGeneratorConstants.GetProjectParentPath()}/{ShellScriptGeneratorConstants.SceneBuildSettingJsonName}");
        }

        var scenes = GetCorrectScene(sceneSetting);

        //AddScenesToBuildSetting(scenes);
        option.scenes = scenes;
        Debug.Log("/////////////////////////");

        for (int i = 0; i < scenes.Length; i++)
        {
            Debug.Log(scenes[i]);
        }
        Debug.Log("/////////////////////////");
        var result = BuildPipeline.BuildPlayer(option);

        if (result.summary.result == UnityEditor.Build.Reporting.BuildResult.Succeeded)
        {
            Debug.Log("BUILD SUCCESS");
        }
        else
        {
            Debug.LogError($"BUILD FAILED {result.summary}");
        }
    }
コード例 #3
0
    private void OnGUI()
    {
        var labelStyle = new GUIStyle(GUI.skin.label);

        labelStyle.wordWrap = true;

        //ApplicationDataPathの上の階層はProjectのRootDirectoryになっているはず
        //その上がgitの置かれるディレクトリ
        ProjectRoot = Directory.GetParent(Application.dataPath).FullName;
        ProjectName = Path.GetFileName(ProjectRoot);

        EditorGUILayout.LabelField($"ProjectRoot : {ProjectRoot}", labelStyle);
        EditorGUILayout.LabelField($"ProjectName : {ProjectName}", labelStyle);
        _shellScriptSetting.ProjectName = ProjectName;

        //アプリケーション名,プラットフォームを入力させる。
        //プラットフォームに応じて拡張子の添付などを行う
        AppName  = EditorGUILayout.TextField("アプリケーションの名称", AppName);
        Platform = (BuildTarget)EditorGUILayout.EnumPopup("Platform", Platform);
        _shellScriptSetting.ApplicationName = GenerateAppName(AppName, Platform);
        _shellScriptSetting.TargetPlatform  = Platform;

        //関数を登録させる
        BuildScript = (MonoScript)EditorGUILayout.ObjectField("ビルドスクリプト", BuildScript, typeof(MonoScript), true);
        if (BuildScript != null)
        {
            //登録したObjectからMonoScriptを取得
            var script = BuildScript;
            //リフレクションしてClassを取得
            var classInfo = script.GetClass();
            if (classInfo != null)
            {
                //public static でvoidのメソッドを取得
                var methods = classInfo.GetMethods()
                              .Where(x => x.ReturnType == typeof(void) && x.IsStatic && x.IsPublic);
                var methodNameList = new List <string>();
                foreach (var method in methods)
                {
                    methodNameList.Add(method.Name);
                }

                if (methodNameList.Count == 0)
                {
                    methodNameList.Add("None");
                    EditorGUILayout.HelpBox("登録したスクリプトアクセス可能なメソッドを取得できませんでした。\n " +
                                            "public staticなメソッドが存在するか確認してください", MessageType.Error);
                }

                var selectOptions = methodNameList.ToArray();

                //選択中のインデックスが条件に合うメソッド数よりも多くなった場合はいったんインデックスを0に戻しとく
                //(例えば途中でビルド用のスクリプトを修正して関数を削った時とか)
                if (SelectMethodIndex >= selectOptions.Length)
                {
                    SelectMethodIndex = 0;
                    Debug.LogError($"ShellScriptGeneratorError! : 選択されたインデックスと関数の数に整合性が取れなくなりました。インデックスを0に戻します");
                }


                SelectMethodIndex = EditorGUILayout.Popup("呼び出す関数", SelectMethodIndex, selectOptions);

                var buildMethod = $"{classInfo.Name}.{selectOptions[SelectMethodIndex]}";
                //NameSpace内にある場合はそれも含めるかたちにする
                if (!string.IsNullOrEmpty(classInfo.Namespace))
                {
                    buildMethod = $"{classInfo.Namespace}.{buildMethod}";
                }

                _shellScriptSetting.BuildMethod = buildMethod;
            }
            else
            {
                EditorGUILayout.HelpBox("登録スクリプトからアクセス可能なクラスを検出できませんでした", MessageType.Error);
            }
        }

        //各種ボタン
        labelStyle.fontStyle = FontStyle.Bold;

        //buildSetting.txtを生成する
        GUILayout.Space(30);
        EditorGUILayout.BeginVertical(GUI.skin.box);
        {
            //Projectのルートディレクトリの上がgitの置かれるディレクトリ
            var path = $"{ShellScriptGeneratorConstants.GetProjectParentPath()}/{ShellScriptGeneratorConstants.SettingFileName}";

            EditorGUILayout.LabelField($"BuildShell と {ShellScriptGeneratorConstants.SettingFileName} を生成します");
            EditorGUILayout.LabelField($"生成先のパス ({ShellScriptGeneratorConstants.GetProjectParentPath()})", labelStyle);
            GUILayout.Space(10);
            if (GUILayout.Button("Generate BuildShell.sh and buildSetting.txt"))
            {
                GenerateSettingFile(path);
            }
        }
        EditorGUILayout.EndVertical();

        //SceneBuildSetting.jsonを生成する
        GUILayout.Space(30);
        EditorGUILayout.BeginVertical(GUI.skin.box);
        {
            EditorGUILayout.LabelField($"{ShellScriptGeneratorConstants.SceneBuildSettingJsonName} を生成します");
            EditorGUILayout.LabelField($"生成先のパス ({ShellScriptGeneratorConstants.GetProjectParentPath()})", labelStyle);
            GUILayout.Space(10);
            if (GUILayout.Button("Generate SceneBuildSetting.json"))
            {
                ShellScriptGeneratorConstants.GenerateSceneBuildSettingJson();
            }
        }
        EditorGUILayout.EndVertical();


        //いったんJsonで出力してテストする
        GUILayout.Space(30);
        EditorGUILayout.BeginVertical(GUI.skin.box);
        {
            EditorGUILayout.LabelField($"SettingFileNameに使用されるデータをJson形式でConsole上に出力します");
            GUILayout.Space(10);
            if (GUILayout.Button("Debug!"))
            {
                Test();
            }
        }
        EditorGUILayout.EndVertical();
    }