概要
Xcode APIではできない処理などC#だけで処理をするには難しい場合があるかと思います。
パッケージが豊富なRubyでそれが解決できないかと、今まで自分が使ってきたことをまとめたいと思います。
(C#側でもできることもあると思いますので、ご容赦下さい。。)
環境
- Unity 5.5.1f1
- Mac (10.12.5)
注意
- Windowsは、下記の手段で実行ができないです。
- PostProcessBuildでエラーが発生してもUnityでは
Build Successful
となるようなので、ログは毎回確認する必要があります。
諸々のコードは以下にあります。
- これ(↑)の
Assets/PostProcessRubyRunner
をコピー - プロジェクトディレクトリに
PostProcessRuby
のディレクトリを作成 -
PostProcessRuby
配下にrubyのコードを書けば動きます(拡張子.rb
は付けて下さい)
実装
複数のRubyのコードが順に実行されるような実装にしています。
重複したコードが増えてしまいますが、必要なくなった時(例えば、UnityのPlayer Settingsで設定できるようになったなど)に対象のファイルの削除で済むので楽です。
PostProcessBuild
- PATHに
rbenv
と/usr/local/bin
を追加 - Ruby側で使用する必要な引数を与える
- Rubyのコードを順次実行するスクリプトを実行する
[PostProcessBuild]
public static void OnPostProcessBuild(BuildTarget buildTarget, string path)
{
var proc = new System.Diagnostics.Process();
var current = Directory.GetCurrentDirectory();
var args = new string[] {
path,
buildTarget.ToString(),
Debug.isDebugBuild.ToString(),
PlayerSettings.productName
};
proc.StartInfo.FileName = Path.Combine(current, kScriptPath);
proc.StartInfo.Arguments = string.Join(" ", args);
proc.StartInfo.CreateNoWindow = true;
proc.StartInfo.RedirectStandardInput = false;
proc.StartInfo.RedirectStandardOutput = true;
proc.StartInfo.RedirectStandardError = true;
proc.StartInfo.UseShellExecute = false;
var homePath = proc.StartInfo.EnvironmentVariables["HOME"];
var rbenvDir = string.Format("{0}/.rbenv/shims:{0}/.rbenv/bin", homePath);
var newPath =
string.Format("{0}:/usr/local/sbin:/usr/local/bin:{1}",
rbenvDir,
proc.StartInfo.EnvironmentVariables["PATH"]);
proc.StartInfo.EnvironmentVariables["PATH"] = newPath;
proc.Start();
var so = proc.StandardOutput.ReadToEnd();
if (!string.IsNullOrEmpty(so))
Debug.Log(so);
var se = proc.StandardError.ReadToEnd();
if (!string.IsNullOrEmpty(se))
Debug.LogError(se);
proc.WaitForExit();
}
PostProcessBuildで実行するシェルスクリプト
ディレクトリ内のrubyファイルをそれぞれ実行します。
実行するファイルの先頭に数字を振っておく(00_xxx)みたいにしておけば実行順序を制御できます。
(私は直接Unityと関係ない.metaファイルができてしまうのが好きでないので、、プロジェクトディレクトリ配下にディレクトリを作っています)
※実行するスクリプトには実行権限を付けて下さい。
※Unity Projectのディレクトリがカレントディレクトリになります。
#!/bin/bash
for script in `/bin/ls -1 ./PostProcessRuby | grep .rb$`; do
echo "%%%%%% Start $script %%%%%%"
"ruby ./PostProcessRuby/$script" "$@"
echo "%%%%%% End $script %%%%%%"
done
とりあえずhello, world
#!/usr/bin/env ruby
p ARGV
p "hello, world"
おわり
これでRuby側でファイルのコピーをしたりすることができます。
出来る限りUnity以外のところでファイルが変更されるのは嬉しくないですが、どうしようもないときってありますよね。。
次はiOSやAndroid用に書いていこうと思います。