GS2 Blog

Game Server Services(https://gs2.io/) の最新情報をお届けします

【新サービス提供開始】チャットとゲーム内プッシュ通知

みなさんこんにちは。GS2 CEOの丹羽です。

先日概要をお伝えしていた GS2-Chat / GS2-InGamePushNotification のサービス提供を開始しました。
GS2-SDK for Unity も同時にリリースしており、今すぐ Unity からサービスをご利用いただけます。

GS2-InGamePushNotification の使用例

通知サーバに接続するためにクライアント証明書を取得する必要があります。
GS2-Auth で認証をした GS2セッション と、通知サーバの識別子である GS2-InGamePushNotificationゲーム名 を指定して取得します。

yield return gs2.InGamePushNotification.CreateCertificate(
    r =>
    {
        if (r.Error != null)
        {
            // 例外が発生
        }
        else
        {
            Certificate certificate = r.Result;
        }
    },
    Session, // GS2セッション
    GameName // GS2-InGamePushNotification ゲーム名
    );

次に通知サーバに接続し、通知を受け取るための通知セッションを作成します。

yield return gs2.InGamePushNotification.CreateSession(
    r =>
    {
        if (r.Error != null)
        {
            // 例外が発生
        }
        InGamePushNotificationSession session = r.Result;
        session.OnConnect += () =>
        {
            // 通知サーバに接続に成功した場合に呼び出されます。
        };
        session.OnReceive += (subject, body) =>
        {
            // 通知を受信したときに呼び出されます。
        };
        session.OnClose += () =>
        {
            // 何らかの理由により通知サーバから切断された場合に呼び出されます。
        };
    },
    Session, // GS2セッション
    GameName, // GS2-InGamePushNotification ゲーム名
    certificate  // クライアント証明書
    );

あとは通知セッションにイベントハンドラを登録すれば通知を受けることが出来ます。

session.OnConnect += () =>
{
    // 通知サーバとの接続に成功した場合に呼び出されます。
}

session.OnReceive += (subject, body) =>
{
    // 通知を受け取った場合に呼び出されます。
}

session.OnClose += () =>
{
    // 通知サーバから切断された場合に呼び出されます。
}

イベントハンドラは以下の種類があります。

OnConnect()
通知サーバとのセッションが確立できたときに呼び出されます。
このコールバックが戻るまでは通知を受け取ることが出来ません。

OnReceive(string subject, string body)
通知を受け取ったときに呼び出されます。

OnClose()
何らかの理由でセッションが切断されたときに呼び出されます。
再接続するなど、必要な処理を実装してください。

通知の送信は GS2-Matchmaking / GS2-Chat といったGS2のサービスから出せるのは当然として、
サーバサイドSDKを使用することで、自分で作成したサーバプログラムから送信することも出来ます。
マネージメントコンソールからGUIを通して通知を送信し、動作確認も行えますのでお気軽にお試しください。

GS2-Chat の使用例

GS2-Chat ではまずルームを作成する必要があります。
しかし、Unity-SDK からはデフォルトで割り当てられたアクセスポリシーではルームを作成する権限を付与していません。
これはルームの作成を無秩序に行われることを望まない開発者がいることを想定しているためです。
ポリシーに権限を割り当てることで、Unityクライアントからルームを作成したり削除する権限を付与することも可能です。

ルームはマネージメントコンソールからGUIを通して作成することも出来ますし、サーバサイドSDKを通して作成することもできます。

作成したルームにメッセージを送信する場合は以下のようなコードになります。

yield return gs2.Chat.Send(
    r =>
    {
        if (r.Error != null)
        {
            // 例外が発生
        }
    },
    Session,    // ゲームセッション
    LobbyName,  // ロビー名
    RoomId,     // ルームID
    "Hello",    // メッセージテキスト
    "meta",     // メッセージメタデータ
    null        // パスワード(ルームにパスワードが設定されている場合に必要)
);

ルームに届いたメッセージを受信する場合は以下です。

yield return gs2.Chat.List(
    r =>
    {
        if (r.Error != null)
        {
            // 例外が発生
        }
        if (r.Result.Count > 0)
        {
            // メッセージの受信処理
            foreach (var message in r.Result)
            {
                Debug.Log("From: " + message.From);
                Debug.Log("Text: " + message.Text);
                Debug.Log("Meta: " + message.Meta);
                Debug.Log("SendDate: " + message.SendDate);    // 最後に受信したメッセージの送信時刻を、次回以降メッセージを取得する際の startAt に指定することでメッセージをストリーム出来ます。 
            }
        }
    },
    Session,    // ゲームセッション
    LobbyName,  // ロビー名
    RoomId,     // ルームID
    10,         // メッセージの取得件数
    startAt     // メッセージの取得開始日時(現在時刻から1時間前まで指定可能)
    );

次に、ルームに新着メッセージが届いたことを知らせて欲しい場合はどうするか?です。
まず、新着メッセージの通知を受けたいルームを購読します。

yield return Gs2.Chat.Subscribe(
    r =>
    {
        if (r.Error != null)
        {
            // 例外が発生
        }
    },
    Session,    // ゲームセッション
    LobbyName,  // ロビーの名前
    RoomId,     // 購読するルームID
    false,      // 通知を送信したときにユーザがオフラインだったときに転送するか
    null        // オフライン転送時のモバイルプッシュ通知転送の通知音に使用するファイル名
);

サーバからの新着メッセージ通知はWebHookまたは、GS2-InGamePushNotification を組み合わせて実現します。
Unity SDK では GS2-InGamePushNotification との連携がインテグレートされています。

Gs2.Chat.OnReceiveMessage += notification =>
{
    Debug.Log("RoolID: " + notification.RoomId);
    Debug.Log("UserId: " + notification.UserId);
    Debug.Log("Message.Text: " + notification.Message.Text);
    Debug.Log("Message.Meta: " + notification.Message.Meta);
};
Gs2.Chat.SetInGamePushNotificationSession(session);

session は GS2-InGamePushNotification の通知サーバとの接続セッションです。
これで、新着メッセージを受信したときにイベントハンドラが呼び出されるようになります。
たったこれだけのコードでスケールし、オフライン時にモバイルプッシュ通知を受けられるチャットシステムをご利用いただけます。
ぜひ、ご検討ください。

それでは、また。

【新サービス】チャットとゲーム内プッシュ通知システム

みなさんこんにちは。GS2 CEOの丹羽です。

本日は近日公開予定の新サービスの紹介をさせてください。
新サービスは2つで、GS2-InGamePushNotification と GS2-Chat です。

GS2-InGamePushNotification

GS2-InGamePushNotification はゲーム内で使用できるプッシュ通知システムです。
MQTT/WebSocket でサーバに常時接続し、サーバからクライアントに対してプッシュ通知を出すことが出来る仕組みです。
GS2-InGamePushNotification は1時間あたり2円(月額およそ1,440円)から利用を開始でき、1時間あたり2円のサービスクラスで1秒間に3回通知をだすことができます。
固定料金とは別に、プッシュ通知送信 1,000回あたり10円。APIリクエスト1,000回あたり3円で利用できます。

GS2-InGamePushNotification はプレイヤーのオンライン状態を管理し、オンライン中のプレイヤーに対しては MQTT/WebSocket を使用してプッシュ通知を出します。
しかし、もしプレイヤーがオフラインだった場合は、モバイルプッシュ通知に転送する機能を持っています。(通知メッセージのペイロードで転送を無効化することも出来ます)

ローンチ時点で、GS2内のサービスでは GS2-Matchmaking と GS2-Chat と連携できます。
GS2-Matchmaking と連携する場合は、マッチメイキングリクエストを出した後、他プレイヤーとのマッチメイキングが成立していく過程で参加者の増減や、完了をプッシュ通知で受けることが出来ます。
完了プッシュ通知はモバイルプッシュ通知転送が有効な状態で出されます。
マッチメイキングリクエストを出した後でゲームをサスペンドしたとしても、マッチメイキングが成立した段階でモバイルプッシュ通知が呼び出され、ゲームの再開を促すことが出来ます。

これまで GS2-Matchmaking はポーリングで参加者の集まり具合や完了確認を行ってきました。GS2-SDK for Unity ではデフォルト3秒間隔でサーバと通信していました。
これによって GS2-Matchmaking のクオータを消費していたり、マッチメイキングの進行状態のハンドリングの即応性がよかったとは言えなかった点が改善されます。

GS2-Chat

GS2-Chat はチャットサービスを提供できるサービスです。
GS2-Chat は1時間あたり3円(月額およそ2,160円)から利用を開始でき、1時間あたり3円のサービスクラスで1秒間に3回のメッセージ送受信が行えます。
固定料金とは別に、メッセージ送信 10,000回あたり10円。メッセージ受信 10,000メッセージあたり5円。APIリクエスト1,000回あたり3円で利用できます。

GS2-Chat はチャットルームを作成し、ルームにメッセージを送信します。
あとは、ルームに対して指定した日時以降のメッセージを取得する。というリクエストを出すことでメッセージを取り出すことが出来ます。

チャットルームに対する新着メッセージ通知を受けたい場合はルームを購読することで、誰かがルームに発言すると通知を受けることが出来ます。
通知を受ける手段は WebHook と GS2-InGamePushNotification が指定できます。
購読する際にモバイルプッシュ通知に転送するか?通知を受けるときに通知音はどうするか?を指定できます。

これによって、フレンドからの tell メッセージや、ギルドチャットの新着メッセージを受けたときにゲームを起動していなくても、
モバイルプッシュ通知で通知を受けることが出来、それぞれで異なる着信音を設定することができます。
ゲームセッションチャットはゲーム中であれば MQTT/WebSocket で新着通知をうけたいけど、モバイルプッシュ通知転送は行わない。というような設定も可能です。

チャットログは1ヶ月単位で指定した期間保存でき、いつでも検索が出来ます。
ログの保管料金として毎月1GBあたり10円。チャットログの検索は検索時に読み込んだログデータのサイズ 1GB あたり 5円と、検索リクエスト1,000回あたり5円が必要です。
特定のユーザのチャットログを追跡したり、不適切なキーワードで発言しているログなどを検索するといった調査にも利用可能です。

提供開始時期

これらのサービスは今月中のリリースを目指して最終的な確認作業に入っています。

それでは、また。

GS2マネージメントコンソールを Google App Engine Standard Java8 に移設しました。

f:id:kazutomo:20170928125054p:plain

みなさんこんにちは。GS2 CEOの丹羽です。

某フレンズの話題で持ちきりで、あまり話題になっていなかったように思いますが、
昨日 Google App Engine Standard Java8 が GA しました。
cloudplatform.googleblog.com

GS2 はサーバレスアーキテクチャを全面に押し出したゲームサーバを開発・提供をしていることを特徴としていますが、
マネージメントコンソールは各マイクロサービスの非公開APIを使用して実現していることもあり、サーバレス化が難しい箇所でした。
(html + javascript でサーバレス化ができなくもないのですが、非公開APIが公開状態になってしまいます)

そこで、やむを得ずマネージメントコンソールは仮想サーバを使用した設計になっていました。
ずっとこの部分はなんとかしたいと思っていた箇所で、過去に Google App Engine も検討したのですが、Flexible の更新ばかりで Standard の更新が長らく止まっており、採用に至らなかった経緯があります。
# Flexible は初期に Compute Engine Managed VMs と呼ばれていたことからわかるように、GCE に皮をかぶせて PaaS に仕立てたもので、
# Standard と比べると制限は緩和されますが、リクエストに合わせて IaaS である GCE のインスタンスが起動し応答するというもので、Standard のようなコスト感やクイックさに欠けます。

このたび GAE Standard が Java8 に対応し、GAしたということで、マネージメントコンソールを Google App Engine に載せることが実現しました。
昨日リリースし、一日様子を見ていましたが問題無さそうですのでこうして発表いたします。おそらく国内で初めてプロダクションに投入した事例なのではないかとおもいます。

GS2を利用したゲームを開発をする際にマネージメントコンソールにアクセスする機会は初期設定や設定変更時のみですので
現状では初回アクセス時にコールドスタートになる事が多く、ページの表示までの待ち時間がこれまでと比べて長くなる点でご迷惑をおかけしますが、
今後のスケーラビリティ確保と障害時の対応体制としてGS2よりもGoogleのほうが優れているという点で、ご理解いただければとおもいます。

今回の移設にあたって GAE を前提とせずに設計・実装されたマネージメントコンソールを GAE 上で動かすには、いくつかの困難が有りましたが、
Google App Engine Standard Java8 ではこれまであったような 利用可能なAPI制限が撤廃されるなど、これまで障害となっていた多くの問題が取り除かれており、想像していたより少ない作業で移設が出来ました。
それらの情報も下記ページで告知している ServerlessConf Tokyo 2017 でかいつまんで説明したいと考えておりますので、ご興味があればご来場ください。
当日参加するのが困難な場合も後日資料をアップロードする予定ですので、このブログの読者になるなどしてウォッチいただければ幸いです。
gs2.hatenablog.com

GS2 では今後も AWS Lambda や API Gateway といった AWS サービスはもちろん、
Google App Engine や Cloud DataStore、Cloud PubSub といった GCP のサービスも含めて個々のサービスのいいところを見極め、活用したサービスを提供していきます。

それでは、また。

【登壇情報】ServerlessConf Tokyo 2017 真のサーバレスアーキテクトとサーバレス時代のゲーム開発・運用

みなさんこんにちは。GS2 CEOの丹羽です。

11月2日〜3日 にわたって開催される ServerlessConf Tokyo 2017 に昨年に引き続き登壇します。
tokyo.serverlessconf.io


f:id:kazutomo:20170927100113p:plain
題目は「真のサーバレスアーキテクトとサーバレス時代のゲーム開発・運用」です。

今回は大きく分けて2つのテーマを扱います。

■ 真のサーバレスアーキテクト

GS2 を開発する際に得られたノウハウを共有します。
ログ収集や、GS2のAPIコール回数の収集、DBトランザクションの取扱や、
近日提供開始予定の Google App Engine 版のマネージメントコンソール開発時の知見など、ノウハウを惜しみなく披露する予定です。

■ サーバレス時代のゲーム開発・運用

前半はサーバを作るという目線ですが、ゲームを作るという目線で考えたときに
そもそも Lambda や GAE でサーバレスを実現するのがいいんだっけ? GS2 みたいな BaaS を使うとどうなるんだろう?
というような内容をお話する予定です。

それでは、また。

【事例紹介】usaya株式会社 おひとよしカメたろう

f:id:kazutomo:20170704190007p:plain

おひとよしカメたろう について

おひとよしすぎるカメのおじさん「カメたろう」が借金を返済していく3Dシミュレーションゲームです。
タップだけでできる放置ゲームで、誰でも簡単に遊べることができます。
カメたろうと可愛い管理人や友達のうさぎなどの個性あふれるキャラクターとの会話も楽しめます。

GS2 が選ばれた理由

ゲーム内で仮想通貨を用いたガチャ機能の導入する予定でしたが、
弊社では購入した仮想通貨の個数管理・レシートチェックなどのサーバーサイド処理の実装実績はありませんでした。
丁度その時GS2の存在を知り、欲しい範囲の機能がUnity用SDKを含めて提供されていたので、
自社でサーバー機能を用意せず、GS2用いることにしました。
初期費用もかからず利用できたのも試してみるきっかけだったと思います。

おひとよしカメたろう の構成

f:id:kazutomo:20170704002609p:plain

ユーザアカウント管理に GS2-Account を、仮想通貨の管理に GS2-Money を使用。

GS2 に対する開発面での感想

管理コンソール上での設定手順やサンプルコードが用意されていたので、使用したい機能に関しては難なく実装できたと感じます。
エラーコードの詳細を把握する点で詰まったことはありましたが、サポートへの問い合わせで即日対応して頂けたので助かりました。

GS2 に対する運用面での感想

初めての利用だったので、リリースにおいて不安な部分もありましたが、
現状のアクセス数範囲だと問題なく機能しており、ユーザーからの問い合わせもなく利用できています。
また、たとえアクセス数が増えてもサービスクラスの変更程度で、弊社側の対応を検討しなくて良いのは楽だと思います。

GS2 に対する費用面での感想

弊社の場合は開発中はほぼ無料枠に収まる範囲で進めることが出来ました。
運用開始後も当初の想定を大きく下回る費用で運用できており、満足しています。



Game Server Services は現在アカウント登録していただいた皆様に 30,000円分のクーポン(有効期限: 登録日から半年間)をプレゼントしています。
この機会にお試しください。

gs2.io


おひとよしカメたろうのダウンロードはこち

おひとよしカメたろう

おひとよしカメたろう

  • USAYA Co., Ltd.
  • ゲーム
  • 無料
play.google.com

消費型アイテムを実現する GS2-ConsumableItem をβテストに加えました

みなさんこんにちは。GS2 CEOの丹羽です。

本日は新サービスの提供開始を告知いたします。
サービス内容は 使うと無くなるアイテム。いわゆる消費型アイテムを管理する仕組みです。
セーブデータでアイテムの残数を管理すると、チート行為によってセーブデータの改ざんや、メモリの改ざんによって不正に利益を享受するユーザが出てきます。
しかし、アイテムの所持数量をサーバで管理することで、このようなチート行為を防ぐことが出来ます。
それを実現するのが GS2-ConsumableItem です。

利用料金は1時間あたり2円(1ヶ月あたりおよそ1500円) + API呼び出し1000回あたり3円 からご利用いただけます。
また、無料枠として 1時間あたり2円のサービスクラスのインスタンスをアカウント登録から1年間は月間750時間無料。
API呼び出しも毎月10万回無料でご利用いただけます。

Unity からアイテムの所持数や消費が行える SDK も同時にリリースしています。
Unity からの利用については こちら を参照ください。

課金石を実現する GS2-Money をβテストに追加しました

みなさんこんにちは。GS2 CEOの丹羽です。

本日は新しいサービスをβテストに追加したことをお知らせします。
既に告知しているサービスですが、GS2-Money という資金決済法に基づく仮想通貨管理を行うためのサービスです。

GS2-Money は主たる機能として以下の機能を提供します。

  • 課金石の所持数管理
  • プラットフォームで異なる財布による所持数管理
  • 有償付与と無償付与の明確な区別

 - 有償付与の課金石でしか購入できない
 - 有償付与の課金石より無償付与の課金石を優先して消費する(またはその逆)

  • 購入単価ごとの発行量管理

 - 消費する際には購入単価の高いものから消費されます(無償付与だけは例外)

 - レシート検証から購入した商品の内容に合わせて課金石を付与するところまで同期的に処理をすることが出来ます

  • 各ユーザの決済履歴・消費履歴の永続的な記録・検索

 - マネージメントコンソールで確認できるのは当然として、REST API / SDK 経由でプログラムからデータを取得することも出来ます

  • 未使用残高の集計
  • 複数の通貨に対応

 - 現時点では 日本円 と 米ドル に対応しています

  • 各種メトリックを収集

 - 1分ごとの売上高の集計
 - チャージリクエスト回数
 - 消費リクエスト回数
 - 財布の中身の取得リクエスト回数
  - など

利用料金は2つの軸で集計します。

  • チャージ額に対して一定の割合で管理費を課金
  • API の呼び出し回数に応じて課金

前者のチャージ額に対して一定の割合で管理費を課金 ですが
チャージ時点での 未使用残高 によってレートが変わります。

詳しくはドキュメントをご確認いただきたいですが、本日時点での利用料金は以下です。

10万円未満 無料
10万円以上、1,000万円未満 チャージ額の10%
1,000万円以上、5000万円未満 チャージ額の8%
5000万円以上、1億円未満 チャージ額の6%
1億円以上 チャージ額の5%

未使用残高を基準に計算しますので、例えば未使用残高が10万円ということは仮想通貨の流通額としてはもっと大きいことになります。
毎月発行額の9割はすぐに消費されるようなゲームであれば、毎月100万円が流通するような状態になるまで管理費はかからない。ということです。

後者の API の呼び出し回数に応じて課金ですが
他のサービスと同様に 1,000回あたり3円 の利用料金がかかります。
ただし、管理費と比較して管理費のほうが高い金額になる場合は無料になります。

Unity SDK も既に GS2-Money に対応したバージョンをリリースしています。
こちらからダウンロード可能です。
使い方については こちら を参照ください。

それでは、また。

(C) Game Server Services, Inc.