GS2 Blog

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

【登壇資料】Cloud2.0時代のゲーム開発を支えるGS2 / 協業のお知らせ #gc_cloud

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

本日開催された Google Cloud INSIDE 7 の登壇資料を公開しましたので、お知らせします。

speakerdeck.com

本登壇の中で 第二世代GS2 の発表をさせていただきました。
第二世代のGS2 は現行世代の GS2 では利用料金が時間あたりの利用料金とAPIリクエストあたりの料金の二軸でしたが、完全リクエスト単価制に変更します。
この変更によって、あらゆる規模のゲームにフェアプライシングでサービスを提供できるようになると確信しています。

さらに、Googleの協力の下第二世代GS2の負荷テストを実施したことも報告させていただきました。
第二世代のGS2は現行世代よりも多くのマイクロサービスを実装した状態でこの夏にβテストを開始し、年内にグローバルで正式サービスを開始します。
マイクロサービスを組み合わせることで、パズドラ・モンストのようなゲームをサーバ開発・運用をすることなく提供できるようになります。
本日よりエントリーを受け付けていますので、GS2のサイトより申し込みください。

第二世代のGS2は現時点で秒間10万リクエストをさばけることを確認しており、
この数値はローンチ時にSNSで話題となり、AppStoreやGooglePlayでセールスランク1位となったスクウェア・エニックスさんのシノアリスの秒間アクセス数5.5万を遥かに上回る数値です。
正式サービス開始までにより高い数値を出せるようチューニングを続けてまいります。

あわせて、本日 クラウドエース株式会社 との協業についても報告できることとなりました。
クラウドエースは GCP のプレミアムパートナー で確かな技術を持った会社です。
GS2 は クラウドエース と戦略的業務提携をおこない、公式のGS2リセラーに認定いたしました。
クラウドエースを経由してGS2を利用する場合、GS2を直接契約して利用するよりも細やかなサポートが受けられます。

ぜひともこのパートナーシップを活用して、面白いゲームを夜に送り出していただければと思います。

それでは、また。

【設立2周年】新しい事務所のご紹介と人材募集のお知らせ

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

2年前の9月7日に Game Server Services 株式会社 は フルサーバレスアーキテクチャで設計開発された安定したゲームサーバをゲーム開発者の皆様に提供し
ゲームサーバの開発・運用業務から解放し、ゲームを面白くすることに集中出来る環境を提供することをミッションとし、ゲームサーバにおけるUnityたる存在になるべく設立し、無事設立2周年を迎えることが出来ました。
設立当初は本当にサービスを使用してもらえるのか不安だったこともありましたが、採用事例も出てきはじめました。
また、多くの会社様に声をかけていただき、開発の進んでいるタイトルも複数存在するというありがたい状況になりました。

特に今年3月末には多くの皆様のご助力により、無事資金調達を終え新しい仲間を迎えられる資金と、以前から支えてくれているワンダープラネットに加え、DeNA / KLab / GameWith / 大和企業投資 という心強いパートナーを得ることが出来ました。
新しいパートナーの存在によって、より安心してサービスをご利用いただける環境が整い、大企業から声をかけていただく機会も増えました。

まだまだ GS2は開発途上であり、今後も精力的に開発を行いサービスを魅力的なものにしていきます。

新しい事務所のご紹介

新しいメンバーを受け入れる体制を整えるべく、先月末に事務所の改装がおわりましたので、本日は新しい事務所のご紹介から入らせていただきます。

エントランス

エントランスホールのような贅沢な空間はありませんが、玄関ドアを抜けるとコーポレートロゴのあしらわれた壁が出迎えてくれます。

AWS さんからオフィス開設祝いのお花をいただいています。
設立間もないスタートアップですが、いろいろ良くしていただいており助かっています。

執務スペース

広々とした執務スペースはオシャレに飾りました。
1600mm × 1600mm という広いL字デスクを各人に割り当てており、椅子もお好みにあわせて購入しています。
ちなみに、私はハーマンミラーのエンボディチェアを愛用しており、既に本社勤務としてフルタイムで入社してくれている従業員も同じくハーマンミラーアーロンチェアを使用しています。

今年の AWS Summit 2018 で Startup Architecture of the Year で オーディエンス賞 を受賞していただいたトロフィー & AWS IoT Enterprise Button と、CEDEC 2018 に登壇した際にいただいたチビトロフィーも飾っています。

共有スペース

狭いながらも会議室も用意しています。

会議室とは別に共有部にも 幅2400mm という巨大なホワイトボードを設置しています。
設計の相談をする際に活用しています。

キッチンスペースにはネスプレッソと紅茶のフリードリンクと小腹が空いた時用にお菓子を用意しています。
疲れてきたらお菓子とコーヒーで一服してリフレッシュします。

まだ用意出来ていませんが、近々部屋の奥に仮眠空間を用意する予定があります。
眠い状態で作業を続けてもいいことはありません。
であれば、30分でも1時間でも仮眠を取ってリフレッシュしてから仕事を再開した方が総合的には生産性は高くなると考えています。
仮眠空間にはハンモックやコットを設置してゆっくりできるようにする予定です。

パソコン

ぼかしだらけで失礼します。
全員に iMac 27インチの i7 モデルに64GBのメモリを割り当てたモデルと Ultra Fine 5K ディスプレイを割り当てています。
広大な画面には2枚のIDEとブラウザ、SlackやAsanaといったコラボレーションツールを並べられるスペースがあります。

GS2 ではSDKの開発で様々な言語向けのプログラムを開発したり、各種ゲームエンジン向けにもSDKを開発する必要があるため広い画面と、巨大なメモリが活躍します。

f:id:kazutomo:20180905103225p:plain

実際にこちらが私のメモリの使用率です。
64GBのメモリが無ければスワップして作業にならないところです。

作業スペースにイヤホンが見えますが、GS2では仕事中に音楽を聴きながら仕事をしても大丈夫です。
ただし、肩を叩かれたりSlackで声をかけられたりしたときには速やかにコミュニケーションがとれる体勢に切り替えて貰う必要はあります。

ちょうど iMac の向こう側には Game Server Services が提供するサービスの稼働状態を表示するディスプレイがあります。
レスポンスタイムやエラーレートが上がるとすぐに検出出来る状態になっています。

人材募集のお知らせ

GS2 では 様々な仕様を持つゲームに対応出来るゲームサーバをフルサーバレスアーキテクチャで設計する という高度なミッションを掲げており、このミッションを成し遂げられる人材を募集しています。

ジョブデスクリプションや諸条件は下記の募集要項ページを参照いただきたいですが、ざっくりと 裁量労働制 年収792万円(月額66万円・みなし残業20時間込み・賞与無し)+ ストックオプション という条件で、サービス開発エンジニアとソリューションアーキテクト兼セールスを募集しています。
要求スキルの高さやミッションの困難さは私も自覚するところですが、スタートアップらしい柔軟な考えでエンジニアが働きやすい職場作りを心がけていますので、我こそは。という方は是非応募してみてください。

gs2.io

それでは、また。

【サービス拡張】GS2-Gold のエンハンス

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

今日は GS2-Gold についてお知らせします。

マスターデータ管理がJSONに対応

GS2-Gold は最近では基本的な設計として利用しているJSONによるマスターデータ管理に対応していませんでした。

本日 GS2-Gold はJSONによるマスターデータ管理に対応し、
開発環境と製品環境でマスターデータをやりとりする手間が少なくなりました。

現在 GS2-Gold を利用されている皆様のデータは自動的にJSON形式でのマスターデータ管理にマイグレーションされています。

1つのリソースで複数のゲーム内通貨を扱えるように

これまで GS2-Gold は1つのリソースで1つのゲーム内通貨しか扱えませんでした。
そのため、ゲーム内で複数種類の通貨を扱おうとすると複数のリソースを作成する必要があり、
GS2-Gold はサービスクラス型の課金形態のため、リソース配分の最適化を行うのが難しい。という課題がありました。

今回、1つのリソースで複数のゲーム内通貨を扱えるようになったことで、より低コストで複数のゲーム内通貨を実装いただけるようになりました。

それでは、また。

【サービス拡張】GS2-ConsumableItem のエンハンス

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

今日は GS2-ConsumableItem についてお知らせします。

マスターデータ管理がJSONに対応

GS2-ConsumableItem はリリースから1年以上が経過しており、
最近では基本的な設計として利用しているJSONによるマスターデータ管理に対応していませんでした。

本日 GS2-ConsumableItem はJSONによるマスターデータ管理に対応し、
開発環境と製品環境でマスターデータをやりとりする手間が少なくなりました。

現在 GS2-ConsumableItem を利用されている皆様のデータは自動的にJSON形式でのマスターデータ管理にマイグレーションされています。

有効期限付の消費型アイテムに対応

これまで GS2-ConsumableItem の消費型アイテムは有効期限を設定出来ませんでした。
今回のアップデートで消費型アイテムに有効期限が設定出来るようになり、今日限定スタミナ回復アイテム や 今月限定ガチャチケット のようなアイテムを用意出来るようになりました。

ご利用中の消費型アイテムに関しては、有効期限無しの状態で設定し反映しています。

また、この変更に伴っていくつかクォーターの消費量に関して注意事項があります。

DescribeInventory で取得する際に同一アイテムが複数返る可能性があるように

1つのアイテムでも有効期限が異なるアイテムを持てるようになります。
その結果、DescribeInventory で取得する際に同一アイテムが複数返ることがあり得るようになります。

GetInventory でインベントリを取得する際に expireAtの指定が必要に

クォーターの消費量がわかりにくくなるため、おすすめはしませんが expireAt 自体は必須ではありません。
指定しない場合全ての有効期限のアイテムがマージされた数量が応答されるようになります。なお、その際マージ前のインベントリの数分クォーターを消費します。

ConsumeItem で消費するアイテムの種類だけでなく、どの expireAt のインベントリから消費するかを指定できるように

こちらも指定は必須ではありませんが、指定することで特定の有効期限のアイテムを消費出来ます。
ユーザに明示的に有効期限が異なる同一アイテムを並べて、ユーザの意思で消費するアイテムを選択して貰うUIを提供する場合は指定して使うことになります。

逆に、指定しない場合はどうなるか。というと、有効期限に近いアイテムから消費数量を満たせるだけ複数のインベントリからアイテムを消費します。
その際消費したインベントリの数分クォーターを消費します。

所持数量の上限は有効期限毎に効果を発揮する

わかりにくくて申し訳ありませんが、スケーラビリティ確保のために仕方が無かったとご理解いただきたいのですが
GS2-ConsumableItem はアイテム毎に所持数量の上限を設定出来ます。
しかし、有効期限毎にアイテムを別に管理する仕組みにした関係で、このアイテムの所持数量制限は有効期限が異なれば別の所持数量としてカウントされます。

今後もGS2は既存サービスも含めて機能拡張を続けて参ります。

それでは、また。

【登壇情報】TECH x GAME COLLEGE #2

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

今日は新しい登壇予定の情報をお知らせします。

【TECH x GAME COLLEGE #2】ゼロからサーバレスの先端に追いつこう
techxgamecollege.connpass.com

こちらで、サーバレスアーキテクチャに関する内容でお話ししたいと考えています。
内容としては、2016年からさまざまな形でサーバレスアーキテクチャに関する登壇をしてきましたが
それらを再編集してお話しすることで、まったくサーバレスアーキテクチャに関する知識のない方に、サーバレスアーキテクチャの最先端に追いついていただこう。という内容です。

ご興味があればエントリーしてみてください。

それでは、また。

【新サービス公開】GS2-Level の公開のお知らせ

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

本日は新しいサービス GS2-Level の公開をお知らせします。
GS2-Level は名前の通り経験値やレベルの実装をサポートするためのサービスです。

経験値・レベルというと、キャラクターのパラメータを一番に思い浮かべると思いますが、
昨今のスマホゲームではキャラクターだけでなく、プレイヤーレベル・スキルレベル・装備レベル・ギルドレベル・親愛度・建築物レベル など様々な要素で経験値・レベルという概念が使われています。
GS2-Level はそれら全てに対応出来るよう設計されており、今後 GS2 を使ってゲーム開発をする際に外せない機能になっていくことを期待しています。

GS2-Level の特徴

レベルテーブル

レベルとは経験値の積み重ねによって成長していく要素です。
つまり、経験値をレベルに変換するテーブルが必要となります。
GS2-Level もその概念を元としており、累積獲得経験値の値から現在のレベルを導き出すレベルテーブルを定義して使用します。

リソースタイプ

スマホゲームでは同じキャラクターという枠組みでもレアリティという要素でカテゴライズされるのがスタンダードです。
さらに、ゲームの味付けとしてレアリティが低いキャラクターは成長させやすいけれど、天井が低い。という味付けがされていることが多いです。

つまり、同じキャラクターでも複数のレベルテーブルがあるのが望ましい。ということになります。
GS2-Level はそれを表現するためにリソースタイプというものを用意しました。
キャラクターや装備にレベルテーブルを都度当てはめるのでは管理コストが高すぎると感じたため、リソースタイプに対してレベルテーブルを設定すれば、あとはキャラクターや装備のような細かなリソースの情報は GS2-Level への登録は不要としています。

レベルキャップ

スマホゲームはキャラクターの成長に軸足を置いているタイトルが多いですが、長期運営を考えればレベルの上限の引き上げは避けられません。
また、成長の楽しみをより演出するためであったり、ガチャのダブりに対する救済としてレベル上限の解放ができるシステムを実装していることも多々あります。

GS2-Level もレベルキャップに関する機能を実装しており、リソースタイプにはデフォルトのレベルキャップが設定出来るようになっています。そしてレベルキャップの変更APIを備えています。
これによって、デフォルトではレベル50を上限に成長しなくなるが、特殊なアイテムを使ったり、ダブったキャラクターを合成することでレベル上限が引き上げられ、最大レベル70まで成長させられる。というような実装が出来ます。

GS2-Level の使い方

例によって、GS2 SDK for Unity での実装例を示します。
GS2-Level で現在の経験値やレベルを取得するサンプルは以下です。

yield return gs2.Level.GetByResourceTypeAndResourceId(
    r =>
    {
        if (r.Error != null) throw r.Error;
        var status = r.Result;
        Debug.Log("ステータスのID: " + status.Id);
        Debug.Log("リソースタイプ名: " + status.ResourceType);
        Debug.Log("リソースのID: " + status.ResourceId);
        Debug.Log("レベル: " + status.Level);
        Debug.Log("リソースのレベルキャップ: " + status.LevelCap);
        Debug.Log("累計獲得経験値: " + status.Experience);
        Debug.Log("次のレベルになる累計獲得経験値: " + status.NextLevelExperience);
    },
    _session,             // GS2 ログインセッション
    ResourcePoolName,     // リソースプール名
    ResourceTypeName,     // リソースタイプ名
    ResourceId1           // リソースID(キャラクターのIDや装備のIDなど。事前にマネージメントコンソールによる登録は不要)
);

gs2.Showcase.GetByResourceTypeAndResourceId() で現在の経験値・レベルを取得できます。

ステータスのIDが分かっている場合は gs2.Level.Get() が使用出来ます。

yield return gs2.Level.Get(
    r =>
    {
        if (r.Error != null) throw r.Error;
        var status = r.Result;
        Debug.Log("ステータスのID: " + status.Id);
        Debug.Log("リソースタイプ名: " + status.ResourceType);
        Debug.Log("リソースのID: " + status.ResourceId);
        Debug.Log("レベル: " + status.Level);
        Debug.Log("リソースのレベルキャップ: " + status.LevelCap);
        Debug.Log("累計獲得経験値: " + status.Experience);
        Debug.Log("次のレベルになる累計獲得経験値: " + status.NextLevelExperience);
    },
    _session,                 // GS2 ログインセッション
    ResourcePoolName,         // リソースプール名
    StatusId                  // ステータスID
);

ステータスIDを複数指定してまとめて経験値・レベルを取得出来ます。
キャラクターに関する経験値・レベルが複数存在し、1画面を構成するのにまとめて取得したいときなどに活用出来ます。

yield return gs2.Level.List(
    r =>
    {
        if (r.Error != null) throw r.Error;
        var statuses = r.Result;
        Debug.Log("ステータスのID: " + statuses[0].Id);
        Debug.Log("リソースタイプ名: " + statuses[0].ResourceType);
        Debug.Log("リソースのID: " + statuses[0].ResourceId);
        Debug.Log("レベル: " + statuses[0].Level);
        Debug.Log("リソースのレベルキャップ: " + statuses[0].LevelCap);
        Debug.Log("累計獲得経験値: " + statuses[0].Experience);
        Debug.Log("次のレベルになる累計獲得経験値: " + statuses[0].NextLevelExperience);
    },
    _session,                        // GS2 ログインセッション
    ResourcePoolName,                // リソースプール名
    new []{ StatusId1, StatusId2 }   // ステータスIDリスト
);

ステータスIDが分からない場合はステータスIDのリストを省略すると、
ログインしているユーザが所有している全ての経験値・レベルを取得出来ます。

ただし、このリクエストはステータスIDを指定する場合の2倍のクォータを必要とします。

yield return gs2.Level.List(
    r =>
    {
        if (r.Error != null) throw r.Error;
        var statuses = r.Result;
        Debug.Log("ステータスのID: " + statuses[0].Id);
        Debug.Log("リソースタイプ名: " + statuses[0].ResourceType);
        Debug.Log("リソースのID: " + statuses[0].ResourceId);
        Debug.Log("レベル: " + statuses[0].Level);
        Debug.Log("リソースのレベルキャップ: " + statuses[0].LevelCap);
        Debug.Log("累計獲得経験値: " + statuses[0].Experience);
        Debug.Log("次のレベルになる累計獲得経験値: " + statuses[0].NextLevelExperience);
    },
    _session,                        // GS2 ログインセッション
    ResourcePoolName                 // リソースプール名
);

ここまで読んでいて、読み込みばかりで加算がないじゃないか。と思われたかもしれません。
GS2-Level はデフォルトでは GS2 SDK for Unity からは経験値の加算は行えない権限設定になっています。
これはチート対策のためであり、プログラムを改造したり、不正にGS2のサーバに通信をすることで意図しない形で経験値を加算する行為を避けるためにこのような仕様になっています。

現在も GS2-Script 経由であれば安全に経験値を加算することは出来ますが、GS2-Level が本領を発揮するのは
今後『クエスト』や『合成・強化』のようなサービスを提供開始したときになると思います。しばらくお時間をいただくことになりますが、
そう遠くない時期にこれらのサービスも追加していきます。

GS2-Level の利用料金

最後に料金についてですが、GS2-Level はサービスクラスによる時間課金+APIコール回数による課金となっています。

level1.nano 2円/時 10クォーター/秒
level1.micro 10円/時 50クォーター/秒
level1.small 20円/時 100クォーター/秒
level1.medium 60円/時 300クォーター/秒
level1.large 200円/時 1000クォーター/秒
level1.xlarge 400円/時 2000クォーター/秒
level1.2xlarge 800円/時 4000クォーター/秒

ステータスの取得 3クォーター/回
経験値の加算 5クォーター/回
レベルキャップの変更 5クォーター/回
ステータスの一括取得(ステータスID指定) 3クォータ/1件
ステータスの一括取得(ステータスID未指定) 6クォータ/1件

上記に加え、API呼び出し 1,000回あたり3円 が発生します。

月額1,500円で、秒間3回の読み込み/2回の書き込み + API呼び出し1000回あたり3円で利用出来るとイメージしてください。

それでは、また。

【新サービス】GS2-Gacha の公開と GS2-Showcase のエンハンスのお知らせ

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

GS2-Gacha を公開

本日は新しいサービス GS2-Gacha の公開をお知らせします。
GS2-Gacha は名前の通りガチャの実装をサポートするためのサービスです。

GS2-Gacha の特徴

抽選確率の管理

レアリティ毎の抽選確率を設定し、そのレアリティ内でリソース毎の抽選確率を設定出来ます。 これによって、レアリティ毎の排出確率を調整する手間が省け、運用がスムーズになります。
また、抽選確率は重みベースの確率設定が可能で、登録したりソースの抽選確率の合計が100%になるよう調整するような手間もありません。
これはたとえば、リソースAを1に、リソースBを4に設定すると、リソースAの排出率が20%。リソースBの排出率が80%として処理されることを意味します。

GS2に登録した抽選確率をクライアントに提供する機能も存在します。 これによって、実際の抽選確率とドキュメントの抽選確率に齟齬が発生するような運用上のミスを最小限に抑えることが可能です。
GS2-Gacha においては、ガチャと排出確率テーブルは別途管理されており、異なるガチャで排出確率テーブルを使い回すことが出来ます。
これによって、単発ガチャと10連ガチャで同じ排出確率テーブルを共有することが可能です。

10連ガチャでSR以上確定のような実装も可能

10連ガチャのような複数回抽選するガチャにおいて、抽選回数毎に異なる排出確率テーブルを設定出来ます。 これによって、10連ガチャでSR以上確定。のような設定が可能です。

GS2-Showcase との連携

GS2-Showcase と連携することで、ガチャの公開期間や抽選回数の制限を設けることが出来ます。

GS2-Showcase のアップデート

実装方法も非常に簡単です。その話をする前に GS2-Showcase のエンハンスの話をします。

商品の購入通貨に GS2-ConsumableItem を追加

これまで GS2-Showcase の対価には ストア決済 / GS2-Money / GS2-Gold が指定出来ました。今回のエンハンスによって GS2-ConsumableItem に対応しました。
GS2-ConsumableItem に対応したことで、ガチャチケットのような機能を実装出来るようになります。

購入対象商品に GS2-Gacha を追加

もう一つのエンハンスは、購入対象に GS2-Gacha が追加されたことです。
これによって、GS2-Showcase にガチャを陳列することが出来るようになり、ガチャの抽選処理まで GS2-Showcase が発行するスタンプシートで処理出来るようになりました。
この機能を使用する場合は、GS2-Gacha の採用にあたって新しく実装をする必要は無く、GS2-Showcase に GS2-Gacha の商品を陳列するだけで対応出来ます!

GS2-Showcase の実装方法については以下のエントリを参考にしてください。
gs2.hatenablog.com

GS2-Gacha の使い方

GS2-Gacha に登録した景品の排出確率を取得するサンプルは以下です。

レアリティ毎の排出確率を取得

    yield return gs2.Gacha.GetGachaProbability(
        result => {
            if(result.Error != null) throw result.Error;
            EzGachaProbabilityList probabilities = result.Result;
            foreach (var item : probabilities)
            {
                Debug.Log("レアリティ名: " + item.Name);
                Debug.Log("排出確率: " + item.Rate);        // 0.0f〜1.0f
            }
        },
        session,            // GS2 ログインセッション
        GachaPoolName,      // GS2-Gacha で作成したガチャプール名
        GachaName,          // GS2-Gacha で作成したガチャ名
        1                   // 何回目の抽選における排出確率を取得するか
    );

リソース毎の排出確率を取得

    yield return gs2.Gacha.GetGachaProbabilityDetail(
        result => {
            if(result.Error != null) throw result.Error;
            EzGachaProbabilityDetailList probabilities = result.Result;
            foreach (var item : probabilities)
            {
                Debug.Log("レアリティ名: " + item.RarityName);
                Debug.Log("リソースID: " + item.ResourceId);
                Debug.Log("排出確率: " + item.Rate);        // 0.0f〜1.0f
            }
        },
        session,            // GS2 ログインセッション
        GachaPoolName,      // GS2-Gacha で作成したガチャプール名
        GachaName,          // GS2-Gacha で作成したガチャ名
        1                   // 何回目の抽選における排出確率を取得するか
    );

ここからは GS2-Gacha を採用するけれど、GS2-Showcase を使用しない場合の実装例を示します。
特別な理由が無ければGS2としては GS2-Showcase 経由での利用を推奨します。

ガチャ一覧の取得

    yield return gs2.Gacha.ListGachas(
        result => {
            if(result.Error != null) throw r.Error;
            // ガチャリストの取得に成功
            EzGachaList gachas = result.Result;
            foreach (var item : gachas)
            {
                Debug.Log("ガチャの名前: " + item.Name);
                Debug.Log("メタデータ: " + item.Meta);
                Debug.Log("抽選回数: " + item.DrawCount);
            }
        },
        session,            // GS2 ログインセッション
        GachaPoolName       // GS2-Gacha で作成したガチャプール名
    );

ガチャの取得

    yield return gs2.Gacha.GetGacha(
        result => {
            if(result.Error != null) throw r.Error;
            // ガチャの取得に成功
            EzGacha gacha = result.Result;
            Debug.Log("ガチャの名前: " + gacha.Name);
            Debug.Log("メタデータ: " + gacha.Meta);
            Debug.Log("抽選回数: " + gacha.DrawCount);
        },
        session,            // GS2 ログインセッション
        GachaPoolName,      // GS2-Gacha で作成したガチャプール名
        GachaName           // GS2-Gacha で作成したガチャ名
    );

ガチャを抽選する

    yield return gs2.Gacha.DoGacha(
        result => {
            if(result.Error != null) throw result.Error;
            EzPrizeList prizes = result.Result;
            foreach (var item : prizes)
            {
                Debug.Log("排出されたリソースID: " + item.ResourceId);
            }
        },
        session,            // GS2 ログインセッション
        GachaPoolName,      // GS2-Gacha で作成したガチャプール名
        GachaName           // GS2-Gacha で作成したガチャ名
    );

GS2-Gacha の利用料金

最後に料金についてですが、GS2-Gacha は完全IO課金となっており、

API呼び出し 1,000回あたり3円 に加え、以下の操作をしたときに追加の費用が発生します。

ガチャ一覧/ガチャ情報の取得 1円/1,000回
抽選処理 3円/1,000回
ガチャマスタのエクスポート 1円/回

それでは、また。

(C) Game Server Services, Inc.