web-dev-qa-db-ja.com

pythonスクリプトをUnityから実行し、後でその出力(テキストファイル)をゲームで使用する

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 () {

    }
}
7
Ran

制御された開発環境の外では信頼できないプロセスを使用する代わりに(ユーザーがPythonインストールされているバージョンとどのバージョンか)さえわからない場合)Python IronPythonを使用してコードで直接、IronPythonはPython CLRのインタープリターであるため、インストールする必要がないPythonスクリプトを実行します。

それを使用するには、コンパイルされたバイナリを http://ironpython.net/download/ からダウンロードする必要があります。

次に、必要なすべてのアセンブリをリソースフォルダーにコピーします。

  • IronPython.dll
  • IronPython.Modules.dll
  • Microsoft.Scripting.Core.dll
  • Microsoft.Scripting.dll
  • Microsoft.Scripting.Debugging.dll
  • Microsoft.Scripting.ExtensionAttribute.dll
  • Microsoft.Dynamic.dll

次に、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 /

6
Isma
  • UnityをダウンロードPythonパッケージ nity Python 0.4.1
  • 次に、[編集]> [プロジェクト設定]> [プレーヤー]> [その他の設定]> [構成]に移動し、スクリプト実行時バージョンを「試験的(.NET 4.6相当)」に変更します。

次のように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());
    }
}
1
Codemaker

次のgithubリポジトリコードを試すことができます。ファイルからpython Unityのコードを使用する基本的なアイデアが得られます

nity Python Demo

0
Codemaker

これが私の作品です。お役に立てれば。

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();
0
Jeff Blumenthal