LoginSignup
1
0

More than 5 years have passed since last update.

PostProcessBuildでRubyを使う

Last updated at Posted at 2017-06-01

概要

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のコードを順次実行するスクリプトを実行する
Assets/PostProcessRubyRunner/Editor/RubyRunner.cs
[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

PostProcessRuby/00_hello_world.rb
#!/usr/bin/env ruby

p ARGV
p "hello, world"

おわり

これでRuby側でファイルのコピーをしたりすることができます。
出来る限りUnity以外のところでファイルが変更されるのは嬉しくないですが、どうしようもないときってありますよね。。

次はiOSやAndroid用に書いていこうと思います。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0