5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

グレンジAdvent Calendar 2024

Day 14

【Unity:エディタ】Unityからシェルスクリプトを実行してみよう

Last updated at Posted at 2024-12-13

グレンジ Advent Calendar 2024 14日目担当の@shirasaya0201です

概要

シェルスクリプトをUnityのエディタウィンドウから実行する機会があったので基本的な手順をまとめてみました

シェルスクリプト作成

まずは呼び出すシェルスクリプトを作成します

HelloWorld.sh
#!/bin/bash

echo "Hello World" $1

Hello World を出力、ついでに引数($1)も渡せるようにしてみます

エディタウィンドウ作成

次にUnityでエディタウィンドウを作成します

SampleEditor.cs
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 を使用します
使いまわせるように汎用的なメソッドを作ります

SampleEditor.cs
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
外部プロセスに渡す引数を指定

実行

ボタンを押した時のイベントを書き換えます

SampleEditor.cs
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から何かを実行するツールを作成するときなどは重宝しそうです
今回は比較的シンプルな実装でしたが、またの機会にもう少し深掘りしてみようかと思います

5
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
5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?