タイトルの通りです。動機とか実行例を載せておきます。
動機
Windows環境のUnityでプロセス間通信(IPC)する!
NamedPipeServerStream
が使えない1んだが!!!!どうせAnonymousPipeServerStream
も使えないんだろ?TCPやUDPは違う。何か実装できそうな(面白い)方法はないか・・・・・・・・・・・・・・・・標準入力いけるか?
環境
- Windows 10
- Unity 2018.4.9f1
コード・ビルド・テスト
-
Assets\Scripts\StdinReader.cs
を作成
Assets\Scripts\StdinReader.cs
using UnityEngine;
using System;
using System.Threading.Tasks;
public class StdinReader : MonoBehaviour
{
void Start()
{
Task.Run(() =>
{
string line;
Debug.LogError("WhileStart");
while ((line = Console.ReadLine()) != null)
{
Debug.LogError("GetLine:" + line);
}
Debug.LogError("WhileEnd");
});
}
}
- Main Cameraにコンポーネントを追加
- [File]→[Build Settings...]の
Development Build
を☑してBuild
、適当にフォルダを作成して選択
-
UnityStdinTest.exe
が生成できていることを確認 - Powershellから起動
echo "first line `n second line `n" | .\UnityStdinTest.exe
- WSLの実行結果も持ってこれます
参考
- unity3d - Fastest way to do local IPC between a Unity process and another C# process - Stack Overflow
- Unityで別プロセスを実行し、ログを受け取る
感想
出来た時は爆笑した。基本的には参考の2番目のように子プロセスを作って標準出力を読み込めばいいと思う。
-
C#をdll化すれば使えなくもない(sh-akira/UnityNamedPipe: 名前付きパイプでUnityを外部アプリからコントロール ・Lachee/unity-named-pipes: A native named pipe wrapper for Unity3D)。Unity内のC#ではないと思ったので採用は見送った。 ↩