グレンジ Advent Calendar 2024 14日目担当の@shirasaya0201です
概要
シェルスクリプトをUnityのエディタウィンドウから実行する機会があったので基本的な手順をまとめてみました
シェルスクリプト作成
まずは呼び出すシェルスクリプトを作成します
#!/bin/bash
echo "Hello World" $1
Hello World を出力、ついでに引数($1)も渡せるようにしてみます
エディタウィンドウ作成
次にUnityでエディタウィンドウを作成します
using System.Diagnostics;
using UnityEngine;
using UnityEditor;
using UnityEngine.UIElements;
public class SampleEditor : EditorWindow
{
[MenuItem("Window/Sample")]
public static void ShowWindow()
{
var window = GetWindow<SampleEditor>("Sample Editor");
window.ShowUtility();
}
private void CreateGUI()
{
var button = new Button();
button.text = "Run";
button.clicked += () =>
{
UnityEngine.Debug.Log("Button clicked");
};
rootVisualElement.Add(button);
}
}
Unityのメニュー Window > Sample でウィンドウが開きます
ボタンを押すと Button clicked のログが表示されます
実行メソッド作成
外部プロセスを実行したい時は System.Diagnostics.Process を使用します
使いまわせるように汎用的なメソッドを作ります
public class SampleEditor : EditorWindow
{
...
private void Run(string fileName, string arguments)
{
var process = new Process();
process.StartInfo.FileName = fileName;
process.StartInfo.Arguments = arguments;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = true;
process.Start();
var output = process.StandardOutput.ReadToEnd();
var error = process.StandardError.ReadToEnd();
process.WaitForExit();
if (!string.IsNullOrEmpty(output))
{
UnityEngine.Debug.Log(output);
}
if (!string.IsNullOrEmpty(error))
{
UnityEngine.Debug.LogError(error);
}
}
}
引数について
- fileName
- 外部プロセスのファイル名を指定
- arguments
- 外部プロセスに渡す引数を指定
実行
ボタンを押した時のイベントを書き換えます
using System.Diagnostics;
using UnityEngine;
using UnityEditor;
using UnityEngine.UIElements;
public class SampleEditor : EditorWindow
{
...
private void CreateGUI()
{
var button = new Button();
button.text = "Run";
button.clicked += () =>
{
var path = "最初に作成した HelloWorld.sh のフルパス";
Run("chmod", $"+x {path}");
Run("/bin/bash", $"{path} {123}");
};
rootVisualElement.Add(button);
}
...
}
path には最初に作成したシェルスクリプトのフルパスを指定します
1つ目の Run で実行権限を付与しています
2つ目の Run でシェルスクリプトを実行しています
パスの後にスペースを開けて引数を入力します
ボタンを押すと以下がログに出力されます
Hello World 123
まとめ
Unityから外部プロセスを実行することはあまりなさそうですが、Unityから何かを実行するツールを作成するときなどは重宝しそうです
今回は比較的シンプルな実装でしたが、またの機会にもう少し深掘りしてみようかと思います