🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

4052閲覧

Unityで外部プログラムを立ち上げ、外部プロセスとインタラクティブなやりとりをしたい

kphex

総合スコア42

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2019/09/13 06:16

タイトルにあるように、Unityから外部のプログラムを立ち上げ、CLIのようなやりとりを行いたいと考えています。以下は現状までで出来ているサンプルコードになります。

cs

1using UnityEngine; 2using System; 3using System.IO; 4using System.Text; 5using System,Diagnostics; 6 7public class Password : MonoBehaviour 8{ 9 Process process = null; 10 StringBuilder output = null; 11 12 void Start() 13 { 14 string text = File.ReadAllText("password.txt"); 15 16 process = new Process(); 17 process.StartInfo.FileName = "password_checker.bundle"; 18 process.StartInfo.UseShellExecute = false; 19 process.StartInfo.RedirectStandardOutput = true; 20 output = new StringBuilder(); 21 22 process.OutputDataReceived += DataReceived; 23 24 process.StartInfo.RedirectStandardInput = true; 25 process.StartInfo.CreateNoWindow = true; 26 27 process.Start(); 28 29 using(StreamWrite sw = process.StandardInput) 30 { 31 sw.Write(text); 32 }; 33 34 process.BeginOutputReadLine(); 35 process.WaitForExit(); 36 process.Dispose(); 37 38 // for debug usage 39 UnityEngine.Debug.Log(output.ToString()); 40 } 41 42 void DataReceived(object sender, DataReceivedEventArgs eventArgs) 43 { 44 output.AppendLine(evnetArgs.Data); 45 } 46}

こちらのスクリプトを空のGameObjectにアタッチして起動すると以下のデバッグ出力になります。

UnityEngine

1Please note that password is NOT RECOVERABLE. 2Type password: Repeat password: 3 4 5UnityEngine.Debug:Log(Object) 6Decrypt:StartCL() (at Assets/Scripts/Password.cs:44) 7Decrypt:Start() (at Assets/Scripts/Password.cs:14)

こちらを以下の様にインタラクティブに行える事を想定しています。

  1. process立ち上げ後Please note that password is NOT RECOVERABLE.がDebugに表示される。
  2. Type password:がDebug表示されUnityからの入力を受け付ける。
  3. sw.Write(text)によってpassword.txt内に記述されているパスワードを渡す。
  4. 再度DebugにRepeat password:がDebugに表示され再入力を受け付ける。
  5. ⑶と同様にパスワードを再入力する。
  6. 認証結果をDebugに表示する、

C#初心者なので多くの内容を網羅していませんが参考になるコードやapiをご存知の方いらっしゃいましたらご教示いただけますと幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

unityがC#なので受け手もC#で作ります。

そうするとSystem.IO.MemoryMappedFiles名前空間を利用することができ、それによって高速なプログラム間の通信が簡単に可能になります

▼非常に簡単に通信が行える

C#

1using... 2using System.IO.MemoryMappedFiles; 3 4public ... 5{ 6 MemoryMappedFile mmf = MemoryMappedFile.CreateNew("Unity2Out", 1024) 7 8 void Send() 9 { 10 MemoryMappedViewAccessor mmva = mmf.CreateViewAccessor(); 11 12 mmva.Write(0, 'a');//<<処理はこれだけ 13 14 mmva.Dispose();//<<Disposeを忘れないこと 15 } 16 17 void Read() 18 { 19 MemoryMappedViewAccessor mmva = mmf.CreateViewAccessor(); 20 21 mmva.ReadChar(0);//<<処理はこれだけ 22 23 mmva.Dispose(); 24 } 25}

などというようにReadとWriteの処理を駆使して、フラグ、文字列等の受け渡しを行えば容易に実装が可能です。


分からないことがあれば、お手数ですがコメント欄まで。

投稿2019/10/31 11:44

KanazawaKureha

総合スコア368

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kphex

2019/11/14 12:56

有り難うございました。`System.IO.MemoryMappedFiles`については未知でしたのでこちらの活用法について知る事ができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問