いつものことながら、バグ探しの旅って、楽しいんだかなんだか。。
しかし、バグって見つかると一種の達成感がある♬
今回は、どんな話かというと、前回Unityでは表示できるのに、OculusGoだとFlaskからもらったTextを表示できないというバグ事象でした。
因みに、Unityで代入したTextは表示できているのに。。。
そして、www.textでGetしたstringはUnity内で代入したstringと同じ挙動をするという。。。
ほとんど判じ物のような状況でした。
前回のコード
flask側
# 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
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じゃないかということで、実施した。
この時点のコードは以下のとおり
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として、以下のとおりとしました。
# 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が提供され、物体認識、音声認識。。などができる。。。話でした。。これからウワンもそこやろうとしてるんだけど(笑)