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" ); } } }
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}"); } }
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(); }