pythonスクリプトをUnity(C#スクリプト)から実行して、後でゲーム内のテキストファイルであるその出力を使用しようとしています。C#スクリプトをUnityで実行すると、何も起こりません(Pythonスクリプトはそれ自体で正常に動作します)私が欠けているものを誰かに教えてもらえますか?ありがとう。
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.IO;
using UnityEngine.UI;
using System.Text.RegularExpressions;
using System.Diagnostics;
using System.Runtime.InteropServices;
public class PyCx : MonoBehaviour {
public Text Message;
public GameObject OpenPanel1 = null;
// Use this for initialization
void Start () {
python ();
read ();
ShowMessage ();
}
public void python(){
ProcessStartInfo pythonInfo = new ProcessStartInfo ();
Process python;
pythonInfo.FileName=@"C:\Users\HP\AppData\Local\Programs\Python\Python36-32\python.exe";
pythonInfo.Arguments=@"C:\Users\HP\Documents\projet1.pyw";
pythonInfo.CreateNoWindow = false;
pythonInfo.UseShellExecute = false;
python = Process.Start (pythonInfo);
python.WaitForExit ();
python.Close ();
}
public void read(){
using (var reader = new StreamReader ("C://Users//HP//Documents//result.txt")) {
string line = reader.ReadToEnd ();
Message.text = (line);
}
}
public void ShowMessage(){
OpenPanel1.SetActive (true);
Message.IsActive ();
}
// Update is called once per frame
void Update () {
}
}
制御された開発環境の外では信頼できないプロセスを使用する代わりに(ユーザーがPythonインストールされているバージョンとどのバージョンか)さえわからない場合)Python IronPythonを使用してコードで直接、IronPythonはPython CLRのインタープリターであるため、インストールする必要がないPythonスクリプトを実行します。
それを使用するには、コンパイルされたバイナリを http://ironpython.net/download/ からダウンロードする必要があります。
次に、必要なすべてのアセンブリをリソースフォルダーにコピーします。
次に、Pythonエンジンにアクセスできます。次のように初期化できます。
PythonEngine engine = new PythonEngine();
engine.LoadAssembly(Assembly.GetAssembly(typeof(GameObject)));
engine.ExecuteFile("Project1.py");
詳細については、こちらをご覧ください: http://ironpython.net/documentation/
参照
http://shrigsoc.blogspot.com.es/2016/07/ironpython-and-unity.htmlhttps://forum.unity.com/threads/ironpython-in- unity-a-good-idea.225544 /
次のようにPythonに小さなコードスニペットtest.pyがあるとします。
class Test():
def __init__(self, name):
self.name = name
def display(self):
return "Hi, " + self.name
あなたはこのようにC#からそれを使うことができます
using System.Collections;
using System.Collections.Generic;
using IronPython.Hosting;
using UnityEngine;
public class PythonInterfacer : MonoBehaviour {
void Start () {
var engine = Python.CreateEngine();
ICollection<string> searchPaths = engine.GetSearchPaths();
//Path to the folder of greeter.py
searchPaths.Add(@"C:\Users\Codemaker\Documents\PythonDemo\Assets\Scripts\Python\");
//Path to the Python standard library
searchPaths.Add(@"C:\Users\Codemaker\Documents\PythonDemo\Assets\Plugins\Lib\");
engine.SetSearchPaths(searchPaths);
dynamic py = engine.ExecuteFile(@"C:\Users\Codemaker\Documents\PythonDemo\Assets\Scripts\Python\test.py");
dynamic obj = py.Test("Codemaker");
Debug.Log(obj.display());
}
}
次のgithubリポジトリコードを試すことができます。ファイルからpython Unityのコードを使用する基本的なアイデアが得られます
これが私の作品です。お役に立てれば。
var psi = new ProcessStartInfo();
// point to python virtual env
psi.FileName = @"C:\Users\someone\Documents\git-repos\PythonVenvs\venv\Scripts\python.exe";
// Provide arguments
var script = @"Assets\Scripts\somecoolpythonstuff\cool.py";
var vidFileIn = "111";
var inputPath = @"Assets\input";
var outputPath = @"Assets\output";
psi.Arguments = string.Format("\"{0}\" -v \"{1}\" -i \"{2}\" -o \"{3}\"",
script, vidFileIn, inputPath, outputPath);
// Process configuration
psi.UseShellExecute = false;
psi.CreateNoWindow = false;
psi.RedirectStandardOutput = true;
psi.RedirectStandardError = true;
// Execute process and get output
var errors = "nothing";
var results = "nothing";
using (var process = Process.Start(psi))
{
errors = process.StandardError.ReadToEnd();
results = process.StandardOutput.ReadToEnd();
}
// grab errors and display them in UI
StringBuilder buffy = new StringBuilder();
buffy.Append("ERRORS:\n");
buffy.Append(errors);
buffy.Append("\n\n");
buffy.Append("Results:\n");
buffy.Append(results);
// ui text object
responseText.Text = buffy.ToString();