質問をすることでしか得られない、回答やアドバイスがある。

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

ただいまの
回答率

88.60%

unityでpythonで書いたコードを使いたい。

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 3,883

meJ15

score 44

 前提・実現したいこと

pythonで書かれたプログラムをunityで読み込みたい。

センサからの情報をpythonで機械学習して出力するプログラムをpythonで書きました。

その出力情報をunity側で受け取り、その値に応じてunity内部にある物体を動かしたいと考えています。

(unityでpythonで書かれたプログラムを使おうとするのではなく
pythonでの出力結果をそのままunityで受け取れれば早いのですが、そちらの方法でも何かアドバイスがありましたらよろしくお願いします。)

そこでこのサイトを参考にまずはpythonで書かれたコードをunityで読み込もうと思いました。
unityでpythonを使う。

上記のサイトを参考にこのようにしたのですが、plguinsの.dllが一つ足りません(3年前の記事だからか?)
イメージ説明

 発生している問題・エラーメッセージ

するとこのようなエラーが出ました。
調べるとunityEngineというモジュールが見つからないということなのですが、、、?

ImportException: No module named UnityEngine
Microsoft.Scripting.Actions.Calls.MethodCandidate+Caller.Call (System.Object[] args, System.Boolean& shouldOptimize) (at <9661a627b9df4cc6a8147ea97a8e7cf4>:0)
IronPython.Runtime.Types.BuiltinFunction+BuiltinFunctionCaller`5[TFuncType,T0,T1,T2,T3].Call4 (System.Runtime.CompilerServices.CallSite site, IronPython.Runtime.CodeContext context, TFuncType func, T0 arg0, T1 arg1, T2 arg2, T3 arg3) (at <9f680c4831e54be9b4f3102a0faa460a>:0)
IronPython.Runtime.Importer.Import (IronPython.Runtime.CodeContext context, System.String fullName, IronPython.Runtime.PythonTuple from, System.Int32 level) (at <9f680c4831e54be9b4f3102a0faa460a>:0)
IronPython.Runtime.Operations.PythonOps.ImportTop (IronPython.Runtime.CodeContext context, System.String fullName, System.Int32 level) (at <9f680c4831e54be9b4f3102a0faa460a>:0)
Microsoft.Scripting.Interpreter.FuncCallInstruction`4[T0,T1,T2,TRet].Run (Microsoft.Scripting.Interpreter.InterpretedFrame frame) (at <9661a627b9df4cc6a8147ea97a8e7cf4>:0)
Microsoft.Scripting.Interpreter.Interpreter.Run (Microsoft.Scripting.Interpreter.InterpretedFrame frame) (at <9661a627b9df4cc6a8147ea97a8e7cf4>:0)
Microsoft.Scripting.Interpreter.LightLambda.Run2[T0,T1,TRet] (T0 arg0, T1 arg1) (at <9661a627b9df4cc6a8147ea97a8e7cf4>:0)
IronPython.Compiler.PythonScriptCode.RunWorker (IronPython.Runtime.CodeContext ctx) (at <9f680c4831e54be9b4f3102a0faa460a>:0)
IronPython.Compiler.PythonScriptCode.Run (Microsoft.Scripting.Runtime.Scope scope) (at <9f680c4831e54be9b4f3102a0faa460a>:0)
IronPython.Compiler.RuntimeScriptCode.InvokeTarget (Microsoft.Scripting.Runtime.Scope scope) (at <9f680c4831e54be9b4f3102a0faa460a>:0)
IronPython.Compiler.RuntimeScriptCode.Run (Microsoft.Scripting.Runtime.Scope scope) (at <9f680c4831e54be9b4f3102a0faa460a>:0)
Microsoft.Scripting.SourceUnit.Execute (Microsoft.Scripting.Runtime.Scope scope, Microsoft.Scripting.ErrorSink errorSink) (at <790e4a6ad97d4a53a26736959b8e2995>:0)
Microsoft.Scripting.SourceUnit.Execute (Microsoft.Scripting.Runtime.Scope scope) (at <790e4a6ad97d4a53a26736959b8e2995>:0)
Microsoft.Scripting.Hosting.ScriptSource.Execute (Microsoft.Scripting.Hosting.ScriptScope scope) (at <790e4a6ad97d4a53a26736959b8e2995>:0)
(wrapper remoting-invoke-with-check) Microsoft.Scripting.Hosting.ScriptSource.Execute(Microsoft.Scripting.Hosting.ScriptScope)
PythonLoader.Start () (at Assets/Script/PythonLoader.cs:21)

 該当のソースコード

using UnityEngine;
using System.Collections;
using System.IO;

public class PythonLoader : MonoBehaviour
{
    void Start()
    {
        string script;
        var filename = Application.dataPath + "/../../test.py";

        using (StreamReader sr = new StreamReader(filename, System.Text.Encoding.UTF8))
        {
            script = sr.ReadToEnd();
        }

        var scriptEngine = IronPython.Hosting.Python.CreateEngine();
        var scriptScope = scriptEngine.CreateScope();
        var scriptSource = scriptEngine.CreateScriptSourceFromString(script);

        scriptSource.Execute(scriptScope);
    }
}
______________________________
test.py

import clr
clr.AddReferenceByPartialName('UnityEngine')
import UnityEngine

import sys
sys.path.append(UnityEngine.Application.dataPath + '/../../Lib')

import datetime


def print_message():
    UnityEngine.Debug.Log('Test message from Python!')
    UnityEngine.Debug.Log(datetime.datetime.today())


print_message()

 試したこと

pythonloaderによって
test.pyはしっかり読み込めていますが、test.pyのなかにあるunityEngineが読み込めていないようです。

unityでpythonで書かれたプログラムを使おうとするのではなく
pythonでの出力結果をそのままunityで受け取れれば早いのですが、そちらの方法でも何かアドバイスがありましたらよろしくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

unityでpythonで書かれたプログラムを使おうとするのではなく
pythonでの出力結果をそのままunityで受け取れれば早いのですが、そちらの方法でも何かアドバイスがありましたらよろしくお願いします。

質問者さんの要件を満たしているかどうかは分かりませんが、ファイルの読み書きでデータを受け渡しするのが楽だと思いますが、どうでしょうか。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/08 21:18

    その方法が楽かと思いチャレンジしていますが、思うように動作しなかったのでまたお願いします。

    キャンセル

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

  • ただいまの回答率 88.60%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る