//tips
//unityによるweb連結
UnityでLitJSONを使用できなくなっているので対策を考える。
LitJSONは Unityに標準では含まれていないので、GitHubからダウンロードしてくる必要があった。
https://github.com/findix/litjson-unity
DownloadHandlerが受け取ったリクエストに対する応答をJsonMapperで変換。
JsonData jsonData = JsonMapper.ToObject(webRequest.downloadHandler.text);
Debug.Log(jsonData["title"]);
Debug.Log(jsonData["description"]["text"]);
Debug.Log(jsonData["forecasts"][0]["date"]);
Debug.Log(jsonData["forecasts"][0]["telop"]);
Debug.Log(jsonData["forecasts"][0]["temperature"]["max"]["celsius"]);
Debug.Log(jsonData["forecasts"][0]["chanceOfRain"]["18-24"]);
Debug.Log(jsonData["forecasts"][1]["date"]);
Debug.Log(jsonData["forecasts"][1]["telop"]);
Debug.Log(jsonData["forecasts"][1]["temperature"]["max"]["celsius"]);
Debug.Log(jsonData["forecasts"][1]["chanceOfRain"]["18-24"]);
Debug.Log(jsonData["location"]["city"]);
プログラムで利用できる形に分解した天気情報を Debug.Logで表示する。
東京都 東京 の天気
UnityEngine.Debug:Log(Object)
<Get_WeatherInfo>d__1:MoveNext() (at Assets/API_Test03.cs:37)
UnityEngine.SetupCoroutine:InvokeMoveNext(IEnumerator, IntPtr) (at /Users/builduser/buildslave/unity/build/Runtime/Export/Coroutines.cs:17)
・・・
といった形で読み込みデータを分解して読み出すことができるようになった。
次は天気予報ではないもので実行してみる。
先の天気予報のものを参考にrequest.downloadHandler.textで取得データを表示させるようにする。
下記のものを作成。
using System.Collections;
using UnityEngine;
//これが必要になります
using UnityEngine.Networking;
public class APIWEB : MonoBehaviour
{
string webURL = "https://kaitakugogo.com/unityxvrxblockchain203";
public void Start()
{
//通信はコルーチンを使って行います。
StartCoroutine(GetData());
}
IEnumerator GetData()
{
UnityWebRequest request = UnityWebRequest.Get(webURL);
yield return request.SendWebRequest();
//エラー処理
if (request.isNetworkError)
{
Debug.Log(request.error);
}
else
{
//リクエストが成功した時
if (request.responseCode == 200)
{
Debug.Log(request.downloadHandler.text);
}
}
}
}
自分のブログで実施したら検証でみられるコードと同様のものが取得できた。
UnityWebRequestの流れを図で確認する。
引用:unity公式サイト
https://docs.unity3d.com/ja/2018.4/Manual/UnityWebRequest.html
Web情報をgetすることはできたので、postする方も確認する。下記からサンプル取得。
https://docs.unity.cn/ja/2017.4/ScriptReference/Networking.UnityWebRequest.Post.html
using UnityEngine;
using UnityEngine.Networking;
using System.Collections;
public class APIPOST : MonoBehaviour
{
void Start()
{
StartCoroutine(Upload());
}
IEnumerator Upload()
{
WWWForm form = new WWWForm();
form.AddField("myField", "myData");
using (UnityWebRequest www = UnityWebRequest.Post("http://www.my-server.com/myform", form))
{
yield return www.SendWebRequest();
if (www.isNetworkError || www.isHttpError)
{
Debug.Log(www.error);
}
else
{
Debug.Log("Form upload complete!");
}
}
}
}
上記を試しに実行してみると
HTTP/1.1 405 Method Not Allowed
UnityEngine.Debug:Log(Object)
<Upload>d__1:MoveNext() (at Assets/APIPOST.cs:23)
UnityEngine.SetupCoroutine:InvokeMoveNext(IEnumerator, IntPtr) (at /Users/builduser/buildslave/unity/build/Runtime/Export/Coroutines.cs:17)
と表示された。そりゃそう。権限がないのに他のサイトに投稿はできない。
他にpostを試せるものを探しているとgoogle翻訳を使用した面白い例を見つけることができたので、そちらを試していく。
https://www.atmarkit.co.jp/ait/articles/0507/01/news133.html
Web上でなんらかの機能を実行するときには、httpを通してサーバーに処理を依頼する形になるので、その処理先がわかれば他のページまたはアプリからその機能を活用できる。
ここではgoogle翻訳がhttp://translate.google.com/translate_t」に対して、4つのパラメータを送信していることがhtmlからわかるので、その機能をunity経由で別の形で実行してみる。
Monobehaviorを継承していないのでunityのオブジェクトにアタッチして実行することはできないのかで、まずはvisual studio上で実行して結果を確認しようとするも結果が返ってこない。
visual studioでのC#スクリプトの実行方法を色々調べてみるとどうも私が使用しているvisual studioと表示が違うので一旦アップグレードをかけた。
インストールし直すと表示が改善。こちらのvisual studioで試していく。
新たなvisual studioで早速試してみたらHttpUtilityの部分でエラー。System.Web 名前空間のアセンブリをメニューの [参照の追加] で「System.Web」コンポーネント名を追加した。
実行するとWebResponse res = req.GetResponse();部分でエラーが返ってきた。調べてみるとアクセス権周りの問題またはファイアウォール関係の問題のよう。
いまいちまだアカウントサイトを生成し、そちらとunityでの情報のやり取りの流れがイメージできない。
そもそもpostするには自分で自由にできるサーバーが必要な気がするので、そのようなサーバーを探すところから始める必要があるのか調査。
https://docs.microsoft.com/ja-jp/aspnet/core/tutorials/first-web-api?view=aspnetcore-5.0&tabs=visual-studio-mac