トーフメモ

主にゲーム制作

C#からPythonを実行する方法【Unity】

f:id:tofgame:20190428235628j:plain
UnityとPythonをつなげてやりたいことがあります。
Python機械学習して、Unityで作ったゲームの中で使う、そんな感じのことがしたいのです。
なのでまずはPythonをどうやって実行するか、というところが課題でした。
調べてみると案外あっさり見つかったので、手順とポイントをまとめていきます!
参考にしたサイトはページ下部にリンクを張るので、そちらを見てください!

実際にやること

UnityのスクリプトからPythonの実行ファイルをたたいて結果を返す感じです。
なので、Pythonの実行環境がない人は先にそちらを構築してください。

Unity(C#)側

using System.Diagnostics;
using System.IO;
using UnityEngine;

public class CsPy : MonoBehaviour {
    //pythonがある場所
    private string pyExePath = @"(Pythonの実行ファイルが置いてある場所)\python.exe";

    //実行したいスクリプトがある場所
    private string pyCodePath = @"(実行したいスクリプトの場所)\tst.py";

    private void Start () {
        //外部プロセスの設定
        ProcessStartInfo processStartInfo = new ProcessStartInfo() {
            FileName = pyExePath, //実行するファイル(python)
            UseShellExecute = false,//シェルを使うかどうか
            CreateNoWindow = true, //ウィンドウを開くかどうか
            RedirectStandardOutput = true, //テキスト出力をStandardOutputストリームに書き込むかどうか
            Arguments = pyCodePath + " " + "Hello,python.", //実行するスクリプト 引数(複数可)
        };

        //外部プロセスの開始
        Process process = Process.Start(processStartInfo);

        //ストリームから出力を得る
        StreamReader streamReader = process.StandardOutput;
        string str = streamReader.ReadLine();

        //外部プロセスの終了
        process.WaitForExit();
        process.Close();

        //実行
        print(str);
    }
}

python.exeの場所と、実際に実行したいpythonスクリプトの場所のフルパスをコード内に書きます。
Processクラスを使用して外部のファイルを実行します。
今回は、実行したpythonスクリプトから得たストリームを文字列にしてunity側で使います。

Python

import sys #引数を得るために使用
playerSelect=str(sys.argv[1])
print( "REPLY[" + playerSelect + "]:" + "Hello,CS." )

sysライブラリを使用して、c#側から送った引数を使用します。
printした文字列が、c#側のストリームに送られます。

実行すると

f:id:tofgame:20190430011001p:plain
うまくやり取りできました!


参考にしたサイト

code.msdn.microsoft.com
qiita.com