2013年6月10日

【Unity】バッチモードビルド



ここ最近は雑用係としていろいろな事をやっております。
その中で、UnityをJenkinsでの自動ビルドに対応させるというのがありまして、
iPhoneアプリ、Androidアプリ共に自動的にUnityで書いたコードからビルド出来るようにするために、
バッチモードでのビルドスクリプトを書きました。


バッチスクリプト

UnityのソースコードはC#で書いているので、
UnityのバッチスクリプトもC#で書きます。

using UnityEngine;                                                                                                                                                                                             
using UnityEditor;
using System.Collections;

public class BatchBuild {
  private static string[] scenes = GetScenes();
  private static string companyName      = "SHONAN SHACHU";
  private static string productName      = "Unity Sample Project";
  private static string bundleVersion    = "1.0.0";
  private static string keystorePath     = "/Users/jenkins/.android/debug.keystore";
  private static string keystorePass     = "android";
  private static string keyaliasName     = "androiddebugkey";
  private static string keyaliasPass     = "android";

  [UnityEditor.MenuItem("Tools/Build Project AllScene")]

  public static void iOSDevelopmentBuild() {
    iOSBuild(true);
  }

  public static void AndroidDevelopmentBuild() {
    AndroidBuild(true);
  }

  private static bool iOSBuild(bool isDebug) {
    EditorUserBuildSettings.SwitchActiveBuildTarget( BuildTarget.iPhone );
    BuildOptions opt = BuildOptions.SymlinkLibraries;
    if (isDebug) {
      opt |= BuildOptions.Development|BuildOptions.ConnectWithProfiler|BuildOptions.AllowDebugging;
    }
    PlayerSettings.companyName = companyName;
    PlayerSettings.productName = productName;
    PlayerSettings.bundleIdentifier = "com.shonanshachu.UnitySampleProject";
    PlayerSettings.bundleVersion = bundleVersion;
    PlayerSettings.defaultInterfaceOrientation = UIOrientation.AutoRotation;
    PlayerSettings.allowedAutorotateToPortrait = true;
    PlayerSettings.allowedAutorotateToPortraitUpsideDown = true;
    PlayerSettings.allowedAutorotateToLandscapeRight = true;
    PlayerSettings.allowedAutorotateToLandscapeLeft = true;
    PlayerSettings.statusBarHidden = true;
    PlayerSettings.iOS.applicationDisplayName = productName;
        
    string errorMsg = BuildPipeline.BuildPlayer(scenes, "bin/ios", BuildTarget.iPhone, opt);
    if(string.IsNullOrEmpty(errorMsg)) {
        Debug.Log("Build iOS succeeded.");
        return true;
    }
    Debug.Log("Build iOS ERROR!");
    Debug.LogError(errorMsg);
    return false;
  }

  private static bool AndroidBuild(bool isDebug) {
    EditorUserBuildSettings.SwitchActiveBuildTarget( BuildTarget.Android );
    BuildOptions opt = BuildOptions.None;
    if (isDebug) {
      opt |= BuildOptions.Development|BuildOptions.ConnectWithProfiler|BuildOptions.AllowDebugging;
    }

    PlayerSettings.companyName = companyName;
    PlayerSettings.productName = productName;
    PlayerSettings.bundleIdentifier = "com.shonanshachu.UnitySampleProject";
    PlayerSettings.bundleVersion = bundleVersion;

    PlayerSettings.defaultInterfaceOrientation = UIOrientation.AutoRotation;
    PlayerSettings.allowedAutorotateToPortrait = true;
    PlayerSettings.allowedAutorotateToPortraitUpsideDown = true;
    PlayerSettings.allowedAutorotateToLandscapeRight = true;
    PlayerSettings.allowedAutorotateToLandscapeLeft = true;

    PlayerSettings.Android.keystoreName = keystorePath;
    PlayerSettings.Android.keystorePass = keystorePass;
    PlayerSettings.Android.keyaliasName = keyaliasName;
    PlayerSettings.Android.keyaliasPass = keyaliasPass;
    PlayerSettings.iPhoneBundleIdentifier = productName;

    PlayerSettings.statusBarHidden = true;
    PlayerSettings.Android.minSdkVersion = AndroidSdkVersions.AndroidApiLevel8;

    string errorMsg = BuildPipeline.BuildPlayer(scenes, "bin/android/UnityNoahSDKSample.apk", BuildTarget.Android, opt);
    if(string.IsNullOrEmpty(errorMsg)) {
      Debug.Log("Build Android succeeded");
      return true;
    }
    Debug.Log("Build Android failed");
    Debug.LogError(errorMsg);
    return false;
  }

  private static string[] GetScenes() {
    ArrayList levels = new ArrayList();
    foreach (EditorBuildSettingsScene scene in EditorBuildSettings.scenes) {
      if(scene.enabled) {
        levels.Add(scene.path);
      }
    }
    return (string[]) levels.ToArray(typeof(string));
  }
}

コマンドラインビルド

最後に、Unityのバッチモードでビルドするには、コマンドラインから、
/Applications/Unity/Unity.app/Contents/MacOS/Unity -batchmode -quit -projectPath "${UNITY_PROJECT_PATH}" -executeMethod BatchBuild.BuildAndroidDevelopment
と実行するとバッチモードでビルド出来ます。

ちなみに、Androidはapkファイルで出来ますが、iOSはプロジェクトが作成されるので、
ここから、xcodebuildでipaファイルまで作成します。

その方法は 【iPhone】Jenkins CIで自動ビルド を参考にしてください。