LoginSignup
0
3

More than 5 years have passed since last update.

【Unity入門】OculusGo⇐Unity⇐Flask連携;Textをもらって表示するが出来た♬

Last updated at Posted at 2018-06-15


※画像をクリックするとYouTube動画につながります

いつものことながら、バグ探しの旅って、楽しいんだかなんだか。。

しかし、バグって見つかると一種の達成感がある♬

今回は、どんな話かというと、前回Unityでは表示できるのに、OculusGoだとFlaskからもらったTextを表示できないというバグ事象でした。

因みに、Unityで代入したTextは表示できているのに。。。
そして、www.textでGetしたstringはUnity内で代入したstringと同じ挙動をするという。。。
ほとんど判じ物のような状況でした。

前回のコード

flask側

app.py
# python
from flask import Flask
app = Flask(__name__)
@app.route("/", methods=['GET'])
def index():
    return "Hello Unity"
if __name__ == "__main__":
    app.debug = True
    app.run()

Unity側のscript

GetText.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;  ////ここを追加////

public class GetText : MonoBehaviour {
    // Use this for initialization
    IEnumerator Start () {
        WWW www = new WWW("http://localhost:5000/");
        yield return www;
        Debug.Log(www.text);
        this.GetComponent<Text>().text = www.text;
    }
    // Update is called once per frame
    void Update () {
    }
}

突然閃いた。。。

実は、一昨日、昨日、本日は解明のために以下作業をしました。
(1)www.textを別途string strA=www.text;として、Unity内で作成したstring strB="Hello Unity";と並べて、比較することにより、同値性を見た。
結果;Unity内では全く同じようにふるまう。特にstrA.Substring(0,5)とか実施できて、差は感じられない
ただし、これで代入したものはOculusGo内で見えることが分かった。しかしwww.textは最初Textエリアの初期値が表示されているが、それが検知と同時に消えてしまう現象が見つかった。”Hello Unity”は表示されない。

(2)上記のGetText.csはUpdate()に記載がないので、IEnumerator Start()は最初動いて、その後はGetしないので、そこを改修してずっと新規にGetTextするように改変
結果;これも実施してみるとUnity内では素早くGetTextしてくれたが、特にそれでOculusGoの表示は改善はしない。消える現象は継続。

(3)いよいよ最後の手段ということで、一度Textファイルに書き出して、再度読み込んでやれば同じstringじゃないかということで、実施した。

この時点のコードは以下のとおり

GetText.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;  ////ここを追加////
using System.IO;

public class GetText2 : MonoBehaviour {
    //通信開始(http://localhost:5000/)
    public void connectionStart(string name)
    {
        string POST_URL = "http://localhost:5000/";
        WWW www = new WWW(POST_URL);
        StartCoroutine("WaitForRequest", www);
    }
    //通信の処理待ち
    private IEnumerator WaitForRequest(WWW www)
    {
        yield return www;
        connectionEnd(www);
    }
    //通信終了後の処理
    private void connectionEnd(WWW www)
    {
        //通信結果をLogで出す
        if (www.error != null)
        {
            Debug.Log(www.error);
            var strB = www.error.Substring(0,11);
            GetComponent<Text>().text = strB;
            textSave(strB);
        }
        else
        {
            //通信結果 -> www.text
            Debug.Log(www.text);
            var strA = www.text.Substring(0,11);
            GetComponent<Text>().text = strA;
            textSave(strA);
        }
    }
    // Update is called once per frame
    void Update()
    {
        connectionStart(name);
    }
    // 引数でStringを渡してやる
    public void textSave(string txt)
    {
        StreamWriter sw = new StreamWriter("LogData.txt", false); //true=追記 false=上書き
        sw.WriteLine(txt);
        sw.Flush();
        sw.Close();
    }
}

【参考】
UnityのWWWで通信処理
UnityでCSVファイルを書き出ししたときのメモ

ある意味、参考のまんまなので、動くよなぁ。。。ということで、特に解説しません。動きます。
Unity内では。。。
この場合は、
Unity内では、出力先はUnityの乗ってるマシンのDirですが、OculusGo上で動いているアプリはOculusGo内に出力するのかなぁ~
。。。
鈍いよね~ここまで来てはたと気が付きました。。。

そうなんです、OculusGo上で動くアプリのlocalhostって???
だよね。。。ということで、Unityが乗っているというか、Flask(Webサーバー)が動いているマシンのhost="192...***"をapp.pyに指定しました!
つまり、app.pyとして、以下のとおりとしました。

app.py
# python
from flask import Flask
app = Flask(__name__)
@app.route("/", methods=['GET'])
def index():
    return "Hello Unity"
if __name__ == "__main__":
    app.debug = True
    app.run(host="192.***.***.***")

。。。な~んだって感じに美しく動きました!
あれ?もちろん
WWW www = new WWW("http://localhost:5000/");

WWW www = new WWW("http://192.***.***.***:5000/");
に変更します。

まとめ

・Textデータ("Hello Unity")に対してOculusGo ⇐ Unity ⇐ Flask連携が出来た
・同時にUnityの場合は、通信履歴としてTextファイルに出力できた
・PanelやCampus、Textの使い方に慣れた

・いよいよ次回は画像に挑戦しよう

一応、以下YouTube動画
OculusGo⇐Unity⇐Flask連携が出来た♬
因みに、次の動画がIBMWatsonのUnity assetsが提供され、物体認識、音声認識。。などができる。。。話でした。。これからウワンもそこやろうとしてるんだけど(笑)

0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3