GS2 Blog

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

【新サービス公開】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円で利用出来るとイメージしてください。

それでは、また。

(C) Game Server Services, Inc.