UnityからREST APIを叩く~NCMBでランキング機能プラグインを作った話~
UnityからREST APIを叩く~NCMBでランキング機能プラグインを作った話~@Takaaki_Ichijo
View Slide
自己紹介:@Takaaki_Ichijo• 株式会社ヘッドハイ 代表取締役• ゲーム作家• 「Back in 1995」• Game DevRel• NCMBエヴァンジェリスト• Play,Doujin! ディレクター• 専門誌でのライター活動• GamesIndustry.biz Japan Edition• 趣味• 刀剣おじさん、ユーリ!!! on ICE おじさん
REST APIをUnityから使おうと思ったきっかけ• NCMB SDK for UnityがWebGLで動かない• 現在対応版開発中とのこと• 理由:Unity WebGLは.Netのクラスがいくつか使えない• System.Threadingが使用出来ない• HttpWebRequest(System.Net)が使用出来ない• NCMBはREST APIを提供しているので、これを利用する
これからはWebGLがじわじわくるぞ• 大手アプリパブリッシャーがWebGLを視野に入れてきた• Unity WebGLがかなり良くなってきた• AppleやGoogleに3割取られない• PCでプレイしてもらうってのは意外と機会がある• 具体例:会社で休憩中に遊ぶ• Unity1週間ゲームジャムの存在• WebGLでゲームを提出する
おさらい:REST APIとは• REST(REpresentational State Transfer)• Webサービスの設計モデル• RESTが定義する設計原則に従ったAPIをRESTful APIと呼ぶ• 特徴• アクセスのインターフェースが統一されている• PUT, GET, POST, DELETEの4つのメソッド• 異なるサービスでも使い勝手が同一• 送受信するデータ形式にはJSONが利用されている場合が多い• JSONであることはRESTの要件ではない
REST APIの利用方法はコマンドcurl -X GET -G ¥-H "X-NCMB-Application-Key:6145f91061916580c742f806bab67649d10f45920246ff459404c46f00ff3e56"¥-H "X-NCMB-Timestamp:2013-12-02T02:44:35.452Z"¥-H "X-NCMB-Signature:/mQAJJfMHx2XN9mPZ9bDWR9VIeftZ97ntzDIRw0MQ4M="¥-H "Content-Type: application/json"¥--data-urlencode 'where={"testKey":"testValue"}'¥https://mb.api.cloud.nifty.com/2013-09-01/classes/TestClassこんなやつ:
Unityの場合:UnityWebRequest• UnityWebRequest• UnityWebRequest は、Unity の WWW クラスをリプレースしたものです。HTTP リクエストを構成し、HTTP レスポンスを処理するためのモジュラーシステムを提供します。(マニュアルより)https://docs.unity3d.com/jp/530/Manual/UnityWebRequest.html
3つのパート• サーバーにデータを送信する• UploadHandler• サーバーからのデータを受信する• DownloadHandler• HTTP フロー制御(リダイレクト、エラー処理、他)• UnityWebRequest• REST API を叩く場合、こいつにコマンドと同じ情報を詰める
public IEnumerator Get(){UnityWebRequest request = UnityWebRequest.Get( “URL” ); //5.3以降はGetTextureとかもあるyield return request.Send();if (request.isError) //2017.1以降は request.isNetworkError{Debug.Log(request.error);//エラー内容}else{byte[] data = request.downloadHandler.data;//~取得したデータの処理~}}
REST APIを叩く手順1. エンドポイントの生成• URL2. クエリストリングの生成• URLの末尾にパラメーターをつけてサーバーに渡す方法?hoge=value&huga=123456 みたいな文字列3. タイムスタンプの取得4. シグネチャ(署名)の生成5. UnityWebRequestに上記の情報を詰める6. リクエストを送信
シグネチャ(署名)のしくみ一定条件でURLやデータからハッシュ生成、暗号化して添付mQAJJfMHx2XN9mPZ9bDWR9VIeftZ97ntzDIRw0MQ4M みたいな文字列↓サーバー側でも同条件で生成↓ハッシュが一致しているか検証↓データの改ざんを検出できる
手順1. 元となる文字列:以下を連結• アプリケーションキー• シグネチャメソッド• シグネチャバージョン• タイムスタンプ• クエリストリング2. メッセージとクライアントキーを秘密鍵としてHMAC-SHA256ハッシュを求める3. ハッシュをBase64でエンコード
実行手順1. UnityWebRequestのインスタンスを作って、エンドポイント+クエリストリングを指定2. UnityWebRequest.SetRequestHeaderにヘッダー情報を入れる3. 受信したデータを格納するためにDownloadHandlerBufferを追加する
UnityWebRequest request = UnityWebRequest.Get(endpoint += "?" + queryString.Trim('&'));request.SetRequestHeader("X-NCMB-Application-Key", applicationKey);request.SetRequestHeader("X-NCMB-Signature", signature);request.SetRequestHeader("X-NCMB-Timestamp", timestamp);request.SetRequestHeader("Content-Type", "application/json");request.downloadHandler = new DownloadHandlerBuffer();yield return request.Send();if (request.isError){Debug.Log(request.error);yield break;}else{yield return request.downloadHandler.text;}
成果物• LeaderboardForUnityWebGL• https://github.com/NCMBMania/LeaderboardForUnityWebGL• Unity WebGLゲームに簡単にリーダーボード(ランキング)をつけられる• REST API利用なのでPC/Mac/iOS/Androidでも普通に動く• デモ• https://unityroom.com/games/leaderboarddemo• https://unityroom.com/games/containership
まとめ• REST APIは(そこそこ簡単に)Unityから使える• 巷にあるさまざまなwebサービスとUnityを簡単に連携できる• NCMB SDK for Unityについて• 今冬に向けて大改装中• そのときには公式SDKがWebGL対応します!