Unityをコマンドラインからビルドする方法についてです。
UnityにはBatchModeという機能が用意されており、コマンドラインから実行できます。
Pro版だとエディタでビルドスクリプトを書き、
BatchModeで直接ビルドスクリプトを実行みたいなことができるみたいです。
これを用いれば、実行時にパラメータを変えてビルドしたり、
シーンを自動で巡回するテストみたいなこともできそうです。
ですが、あいにく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 などから呼び出すことで、ビルドの自動化ができます。