UnityをFree版でコマンドラインからビルドする

Unityをコマンドラインからビルドする方法についてです。

UnityにはBatchModeという機能が用意されており、コマンドラインから実行できます。

Unity – Unity Manual

Pro版だとエディタでビルドスクリプトを書き、
BatchModeで直接ビルドスクリプトを実行みたいなことができるみたいです。

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

これを用いれば、実行時にパラメータを変えてビルドしたり、
シーンを自動で巡回するテストみたいなこともできそうです。

ですが、あいにくPro版は持ってないので
別の方法でFree版でのコマンドラインビルドを行ってみます。

コマンドラインからビルドする

単純にビルドするだけでしたら下記のようなコマンドでできます。

"C:/Program Files (x86)/Unity/Editor/Unity.exe" -batchmode -nographics -projectPath "{project_path}" -buildWebPlayer "{output_path}" -quit

コマンドはUnity.exeに投げます。
Unity.exeのパスは環境に応じて書き換えてください。

-nographics の指定でグラフィックスデバイスの初期化を行わなくなります。
今回はビルドを行うだけですので、指定しておきます。

-projectPath <path> で対象のプロジェクトのディレクトリを指定します。

-buildWebPlayer <path> の部分がビルドターゲットの指定と、出力パスの指定です。
ドキュメントを見る限りは

  • -buildWindowsPlayer <path>
  • -buildOSXPlayer <path>
  • -buildLinux32Player <path>
  • -buildLinux64Player <path>
  • -buildWebPlayer <path>
  • -buildWebPlayerStreamed <path>

が用意されているようです。

-quit で実行後に自動で終了するようになります。

上記のコマンドを叩いてout_pathに出力されていたらOKです。

ビルド設定を変更する

単純なビルドは上記コマンドで行けますが、
ビルドごとに設定を変えたいときがあります。
たとえば解像度を変えたいとか、Development Buildするとか。
BatchMode の executeMethod を用いてUnity内のビルドスクリプトを叩けば
ビルド設定を自由に変えることができますが、Pro版限定の機能です。

なので今回は設定が記述されたファイルを直接操作することにします。

解像度などの設定は ProjectSettings/ProjectSettings.asset に記述されています。
前回 ちょろっと書いた Asset を テキストで保存する設定にしておけば、
この設定ファイルもYAMLで出力されるようになります。
あとはビルド前にYAMLを書き換えるなり、
このファイルを差し替えるなりすればいけそうです。

ビルドするrubyスクリプトかいてみた

上記を考慮してビルドするスクリプトを ruby で書いてみました

UnityBuilder.rb


#ruby -Ku

require "fileutils"
require "tempfile"

class UnityBuilder
  
  UNITY_PATH = "C:/Program Files (x86)/Unity/Editor/Unity.exe"
  
  BUILD_TARGETS = {
     :windows   => "buildWindowsPlayer",
     :mac       => "buildOSXPlayer",
     :linux     => "buildLinux32Player",
     :linux64   => "buildLinux64Player",
     :web       => "buildWebPlayer",
     :webstream => "buildWebStreamed"
  }
  
  def build( args )
    args = default_args().update( args )
    verify( args )
    
    log_path = args[:log_path]
    log_path = Tempfile.new("unitylog").path if( log_path == nil )
    
    command =
      "\"#{UNITY_PATH}\" -batchmode -nographics -projectPath \"#{args[:project_path]}\" " +
      "-#{BUILD_TARGETS[args[:build_target].to_sym]} \"#{args[:out_path]}\" " +
      "-logFile \"#{log_path}\" -quit"
    puts "command : #{command}"
    
    settings_path = File.expand_path( "#{args[:project_path]}/ProjectSettings/ProjectSettings.asset" )
    
    if( args[:settings_path] != nil )
      FileUtils.mv( settings_path, settings_path + ".bak" )
      FileUtils.cp( args[:settings_path], settings_path )
    end
    
    `#{command}`
    result_code = $?.to_i
    
    if( args[:settings_path] != nil )
      FileUtils.mv( settings_path + ".bak", settings_path )
    end
    
    puts File.open( log_path, "rb" ).read
    
    exit( result_code )
  end
  
  def default_args()
    return {
      :build_target => :web
    }
  end
  
  def verify( args )
    raise "please set ':project_path'" if( args[:project_path] == nil )
    raise "please set ':out_path'" if( args[:out_path] == nil )
    raise "please set ':build_target'" if( args[:build_target] == nil )
    raise "#{args[:build_target]} is unknown target" if( !BUILD_TARGETS.keys.include?( args[:build_target].to_sym ) )
  end
  
end

if __FILE__ == $0

  require "optparse"

  opt = OptionParser.new
  
  args = Hash.new
  opt.on( "--project_path=path" )   { |path| args[:project_path] = File.expand_path( path ) }
  opt.on( "--out_path=path" )       { |path| args[:out_path] = File.expand_path( path ) }
  opt.on( "--build_target=target" ) { |target| args[:build_target] = target.to_sym }
  opt.on( "--log_path=path" )       { |path| args[:log_path] = File.expand_path( path ) }
  opt.on( "--settings_path=path" )  { |path| args[:settings_path] = File.expand_path( path ) }
  opt.parse( ARGV )
  
  builder = UnityBuilder.new
  builder.build( args )
  
end

下記のような感じで使えます

UnityBuilder.rb --project_path=<ProjectPath> --out_path=<OutPath> --build_target=web --settings_path<SettingsPath> --log_path=<LogPath>

ビルドターゲットを web, windows, mac などの指定を行い、
settings_path に使用する ProjectSettings.asset のパスを指定します。
settings_path に指定があった場合はビルド前に差し替えて、ビルド後に元にもどします。

あとは上記スクリプトを Jenkins などから呼び出すことで、ビルドの自動化ができます。


コメントを残す

メールアドレスが公開されることはありません。