
マイケル
みなさんこんにちは!
マイケルです!
マイケルです!

エレキベア
こんにちクマ〜〜〜

マイケル
今日は UnityWebRequest の使い方について見ていくよ!

エレキベア
UnityWebRequestとは何クマ??

マイケル
UnityからWebサーバと通信するために使われる機能だよ!
今回はこれを使って下記のような
CRUD機能(作成、検索、更新、削除)を作ってみます!
今回はこれを使って下記のような
CRUD機能(作成、検索、更新、削除)を作ってみます!

エレキベア
WEBアプリとかで最初に作ったりするやつクマね

マイケル
コードはUnity側だけになるけどGitHubにあげているので
参考にお使いください!
参考にお使いください!
GitHub(masarito617) – unity-web-request-sample

マイケル
それではやっていこう!

エレキベア
楽しみクマ〜〜〜〜
参考書籍

マイケル
今回は特に書籍は使わずに、
下記の公式リファレンスを参考にしています!
下記の公式リファレンスを参考にしています!
UnityWebRequest – Unityスクリプトリファレンス

マイケル
WEBAPIについては下記書籍がおすすめです!
少し古いけどWebの歴史から知ることができるので読み物としても面白いですね。
少し古いけどWebの歴史から知ることができるので読み物としても面白いですね。
Webを支える技術 ―― HTTP,URI,HTML,そしてREST WEB+DB PRESS plus

エレキベア
これは定番クマ〜〜〜
UnityWebRequestの使い方

マイケル
まずは簡単な使い方についてみていこう!
基本的には下記のようにリクエストを作成してレスポンスを受け取ります。
SendWebRequest は非同期のためコルーチン内で実行する必要があります。
基本的には下記のようにリクエストを作成してレスポンスを受け取ります。
SendWebRequest は非同期のためコルーチン内で実行する必要があります。
↑基本的な使い方

エレキベア
シンプルクマね

マイケル
リクエストに関しては GET/POST/PUT/DELETE
それぞれ作成することができます。
この時、POSTに関してはWWWFormを使用して値を送ることができます。
それぞれ作成することができます。
この時、POSTに関してはWWWFormを使用して値を送ることができます。
↑リクエストの作成
↑WWWFormを使用したリクエスト作成

エレキベア
値を送るのもこれなら簡単クマね

マイケル
最後にContent-Typeについてですが、
UnityWebRequestはデフォルトでapplication/x-www-form-urlencodedで送信されます。
application/jsonで送信したい場合には、下記のようにUploadHandlerRaw、DownloadHandlerBufferを自身でnewして送る必要があるようです。
UnityWebRequestはデフォルトでapplication/x-www-form-urlencodedで送信されます。
application/jsonで送信したい場合には、下記のようにUploadHandlerRaw、DownloadHandlerBufferを自身でnewして送る必要があるようです。
↑application/jsonでの送信

エレキベア
JSON形式で送りたい場合もよくありそうクマね

マイケル
それじゃ使い方はこの辺にしておいて、さっそく使っていこう!
CRUD機能の実装
APIサーバの作成

マイケル
送信先が必要なので、簡単なAPIサーバを準備します。
ここではRuby on Railsを使って、下記のBookテーブルを操作するだけの機能を実装しました。
ここではRuby on Railsを使って、下記のBookテーブルを操作するだけの機能を実装しました。
Bookテーブル構成
本ID | 名前 | 価格 |
id : integer | name : string | price : integer |

エレキベア
かなりシンプルなテーブルクマね

マイケル
APIサーバの作成について詳細は省きますが、
参考までにコマンドを載せておきます!
参考までにコマンドを載せておきます!
↑APIサーバの作成

マイケル
この状態で起動してhttp://127.0.0.1:3000にアクセスすると、
お馴染みのWelcome画面が表示されます!
お馴染みのWelcome画面が表示されます!

エレキベア
これだけでサーバ立てられるのは便利クマね〜〜〜

マイケル
resourceコマンドで作成したため、ルーティングは下記のように設定されています。
これらの処理をcontrollerクラスに記述しましょう!
これらの処理をcontrollerクラスに記述しましょう!
↑routes情報
↑各処理の記述

マイケル
これでサーバ側の最低限の準備はできました!
あとは、http://127.0.0.1:3000/books にUnity側からリクエストするようにしていきましょう。
あとは、http://127.0.0.1:3000/books にUnity側からリクエストするようにしていきましょう。

エレキベア
楽しみクマ〜〜〜〜
Unity側の実装
UI構成

マイケル
UIの構成についてですが、
今回は下記のような本アイテムのプレハブをScrollViewの中に生成する
といった構成にしました。
今回は下記のような本アイテムのプレハブをScrollViewの中に生成する
といった構成にしました。

マイケル
プレハブには下記のようなスクリプトをアタッチしておきます。
事前に各UIを割り当てて置くことでGetComponentする数を減らすことができます。
事前に各UIを割り当てて置くことでGetComponentする数を減らすことができます。
↑本アイテムスクリプトの作成

エレキベア
いちいち各フィールドをGetComponentしていたら効率が悪いクマね
本リストの表示

マイケル
まずは本リストの表示機能から!
下記のように、起動時とリロードボタン押下時に取得して表示するようにします。
下記のように、起動時とリロードボタン押下時に取得して表示するようにします。

エレキベア
GETリクエストを送信して
レスポンスから本アイテムを生成するクマね
レスポンスから本アイテムを生成するクマね

マイケル
まず本リスト全体を管理するスクリプトを作成し、共通で使用する送信処理を用意しました。
下記のように
リクエストとコールバックを渡して、レスポンスが返ってきたらコールバックを実行する
といった処理にします。
下記のように
リクエストとコールバックを渡して、レスポンスが返ってきたらコールバックを実行する
といった処理にします。
↑送信処理の作成

マイケル
そしてこの送信処理をGetBookList()内から呼び出します!
↑取得処理の実装

マイケル
コールバック内で返ってきたJSONをclassに変換してUIに設定しています。
JsonUtility.FromJsonを使って変換することができますが、classには[Serializable]を付ける必要があることには注意です。
JsonUtility.FromJsonを使って変換することができますが、classには[Serializable]を付ける必要があることには注意です。

エレキベア
これで表示機能はできたクマね
本アイテムの追加

マイケル
次にアイテムの追加について!
入力された内容をPOSTリクエストで送信しますが、
ここではapplication/jsonを使用した送信処理を実装してみました。
入力された内容をPOSTリクエストで送信しますが、
ここではapplication/jsonを使用した送信処理を実装してみました。
↑追加処理の実装

マイケル
最小限のため、入力チェック処理が入っていないことには注意です!

エレキベア
(手抜きクマ・・・。)
本アイテムの更新

マイケル
次に本アイテムの更新処理について!
これもapplication/jsonでPUTリクエストを送信します。
これもapplication/jsonでPUTリクエストを送信します。
↑更新処理の実装

エレキベア
追加処理とほぼ同じクマね
本アイテムの削除

マイケル
そして最後に削除処理について!
これはシンプルでidを付与したURLをDELETE送信するだけになります。
これはシンプルでidを付与したURLをDELETE送信するだけになります。
↑削除処理の実装

マイケル
以上で最低限のCRUD機能の実装完了です!!

エレキベア
楽勝だったクマね
WWWFormを使用する場合

マイケル
ちなみにWWWFormでPOST、PUTリクエストを送る場合には
下記のようにリクエストを作成します!
PUTメソッドではWWWFormを使用できないため、
POSTリクエスト作成後にrequest.methodにPUTを指定するようにします!
下記のようにリクエストを作成します!
PUTメソッドではWWWFormを使用できないため、
POSTリクエスト作成後にrequest.methodにPUTを指定するようにします!
↑WWWFormを使用した送信

マイケル
というのも、htmlのformでもPUT、DELETE送信がサポートされていないためだと思われます。
htmlから送る場合にもhiddenパラメータとして_methodを指定して送るのが定番となっているため、同じようなイメージで使用するといいと思います。
htmlから送る場合にもhiddenパラメータとして_methodを指定して送るのが定番となっているため、同じようなイメージで使用するといいと思います。

エレキベア
とりあえずWWWFormを使う時にはPOST送信クマね
おわりに

マイケル
というわけで今回はUnityでCRUD機能を実装してみました!
どうだったかな?
どうだったかな?

エレキベア
クライアントサーバ連携がめんどくさそうだったクマが、
やってみたら思っていたよりも簡単に出来てびっくりしたクマ
やってみたら思っていたよりも簡単に出来てびっくりしたクマ

マイケル
通信処理はソシャゲを作る際には避けて通れないので
どんどん触って慣れていこう!
どんどん触って慣れていこう!

マイケル
それでは今日はこの辺で!
アデュー!!!
アデュー!!!

エレキベア
クマ〜〜〜〜〜
【Unity】UnityWebRequestを使ってCRUD機能を実装する【Ruby on Rails】〜完〜