Upgrade to Pro — share decks privately, control downloads, hide ads and more …

UnityからREST APIを叩く~NCMBでランキング機能プラグインを作った話~

Takaaki Ichijo
September 06, 2017

UnityからREST APIを叩く~NCMBでランキング機能プラグインを作った話~

UnityからREST APIを叩く~NCMBでランキング機能プラグインを作った話~

Takaaki Ichijo

September 06, 2017
Tweet

More Decks by Takaaki Ichijo

Other Decks in Technology

Transcript

  1. UnityからREST APIを叩く
    ~NCMBでランキング機能プラグインを作った話~
    @Takaaki_Ichijo

    View Slide

  2. 自己紹介:@Takaaki_Ichijo
    • 株式会社ヘッドハイ 代表取締役
    • ゲーム作家
    • 「Back in 1995」
    • Game DevRel
    • NCMBエヴァンジェリスト
    • Play,Doujin! ディレクター
    • 専門誌でのライター活動
    • GamesIndustry.biz Japan Edition
    • 趣味
    • 刀剣おじさん、ユーリ!!! on ICE おじさん

    View Slide

  3. REST APIをUnityから使おうと思ったきっかけ
    • NCMB SDK for UnityがWebGLで動かない
    • 現在対応版開発中とのこと
    • 理由:Unity WebGLは.Netのクラスがいくつか使えない
    • System.Threadingが使用出来ない
    • HttpWebRequest(System.Net)が使用出来ない
    • NCMBはREST APIを提供しているので、これを利用する

    View Slide

  4. これからはWebGLがじわじわくるぞ
    • 大手アプリパブリッシャーがWebGLを視野に入れてきた
    • Unity WebGLがかなり良くなってきた
    • AppleやGoogleに3割取られない
    • PCでプレイしてもらうってのは意外と機会がある
    • 具体例:会社で休憩中に遊ぶ
    • Unity1週間ゲームジャムの存在
    • WebGLでゲームを提出する

    View Slide

  5. おさらい:REST APIとは
    • REST(REpresentational State Transfer)
    • Webサービスの設計モデル
    • RESTが定義する設計原則に従ったAPIをRESTful APIと呼ぶ
    • 特徴
    • アクセスのインターフェースが統一されている
    • PUT, GET, POST, DELETEの4つのメソッド
    • 異なるサービスでも使い勝手が同一
    • 送受信するデータ形式にはJSONが利用されている場合が多い
    • JSONであることはRESTの要件ではない

    View Slide

  6. 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
    こんなやつ:

    View Slide

  7. Unityの場合:UnityWebRequest
    • UnityWebRequest
    • UnityWebRequest は、Unity の WWW クラスをリプレースしたもの
    です。HTTP リクエストを構成し、HTTP レスポンスを処理するため
    のモジュラーシステムを提供します。
    (マニュアルより)
    https://docs.unity3d.com/jp/530/Manual/UnityWebRequest.html

    View Slide

  8. 3つのパート
    • サーバーにデータを送信する
    • UploadHandler
    • サーバーからのデータを受信する
    • DownloadHandler
    • HTTP フロー制御(リダイレクト、エラー処理、他)
    • UnityWebRequest
    • REST API を叩く場合、こいつにコマンドと同じ情報を詰める

    View Slide

  9. 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;
    //~取得したデータの処理~
    }
    }

    View Slide

  10. REST APIを叩く手順
    1. エンドポイントの生成
    • URL
    2. クエリストリングの生成
    • URLの末尾にパラメーターをつけてサーバーに渡す方法
    ?hoge=value&huga=123456 みたいな文字列
    3. タイムスタンプの取得
    4. シグネチャ(署名)の生成
    5. UnityWebRequestに上記の情報を詰める
    6. リクエストを送信

    View Slide

  11. シグネチャ(署名)のしくみ
    一定条件でURLやデータからハッシュ生成、暗号化して添付
    mQAJJfMHx2XN9mPZ9bDWR9VIeftZ97ntzDIRw0MQ4M みたいな文字列

    サーバー側でも同条件で生成

    ハッシュが一致しているか検証

    データの改ざんを検出できる

    View Slide

  12. 手順
    1. 元となる文字列:以下を連結
    • アプリケーションキー
    • シグネチャメソッド
    • シグネチャバージョン
    • タイムスタンプ
    • クエリストリング
    2. メッセージとクライアントキーを秘密鍵としてHMAC-
    SHA256ハッシュを求める
    3. ハッシュをBase64でエンコード

    View Slide

  13. 実行手順
    1. UnityWebRequestのインスタンスを作って、エンドポイント+クエリ
    ストリングを指定
    2. UnityWebRequest.SetRequestHeaderにヘッダー情報を入れる
    3. 受信したデータを格納するためにDownloadHandlerBufferを追加する

    View Slide

  14. 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;
    }

    View Slide

  15. 成果物
    • LeaderboardForUnityWebGL
    • https://github.com/NCMBMania/LeaderboardForUnityWebGL
    • Unity WebGLゲームに簡単にリーダーボード(ランキング)をつけられる
    • REST API利用なのでPC/Mac/iOS/Androidでも普通に動く
    • デモ
    • https://unityroom.com/games/leaderboarddemo
    • https://unityroom.com/games/containership

    View Slide

  16. まとめ
    • REST APIは(そこそこ簡単に)Unityから使える
    • 巷にあるさまざまなwebサービスとUnityを簡単に連携できる
    • NCMB SDK for Unityについて
    • 今冬に向けて大改装中
    • そのときには公式SDKがWebGL対応します!

    View Slide