その他
    ホーム 技術発信 DoRuby ボックスガチャの実装をしよう(ソーシャルゲームにおけるサーバーサイド) 1
     

    ボックスガチャの実装をしよう(ソーシャルゲームにおけるサーバーサイド) 1

    この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

    この無料分で引けなかったら諦める

    ガチャから派生させてボックスガチャを作る事になりました

    ぷらんなー「このゲーム、普通のガチャはあるけどさ、ボックスガチャやりたいから作って」
    さーばーえんじにあ「ボックスガチャか」
    ぷらんなー「必要な機能は大まかに言うと、
    ・ボックスガチャを引く
    ・現在のボックスの中身を確認
    ・各ステージでのボックスの中身の確認
    ・ボックスガチャのリセット
    ね。リセット回数はガチャを定義する親マスタで制限かけるから。
     細々とした仕様は後で仕様書が完成したら共有するけど、取り敢えず確定事項です」
    さーばーえんじにあ「りょーかい」

    ボックスガチャってなぁに?

     例えるならば、ガチャポンです。
     中身が有限なガチャです。
     排出率が1%のレアキャラが出るガチャだったら、通常は100回引いても大体63%の確率でしか引けませんが、ボックスガチャならば中身が有限なので、中身を全て引けば100%出す事が出来ます。
     やったね!!

    ガチャから派生させてボックスガチャを実装するにはどういうAPIとどういう追加データが必要だろう

    さーばーえんじにあ「必要なAPIとしては、まあ、必要な機能の通りで、
    ・ボックスガチャを引く
    ・現在のボックスの中身を確認
    ・各ステージでのボックスの中身の確認
    ・ボックスガチャのリセット
    で大丈夫だよな」
    さーばーえんじにあ「で、サーバー側で持つべきデータとしてはまず、
    ・ユーザーのボックスの現在状態
    が必要だよな。で、えっと? 機能に 各ステージでのボックスの中身の確認 なんて項目があるって事は、リセットする度にボックスの中身変わるのかな?」
    ぷらんな「そうだよ。仕様書もうそろそろ出来るから、ちょっと待ってて」
    さーばーえんじにあ「あ、はい。なら、
    ・ステージ毎のボックスの中身を定義するマスタ
    を別に作った方がいいか。通常のガチャの中身を定義するマスタとは段々かけ離れてくるし。
    ……その位か」

    必要な機能:
    ・ボックスガチャを引く
    ・現在のボックスの中身を確認
    ・各ステージでのボックスの中身の確認
    ・ボックスガチャのリセット
    必要な追加データ:
    ・ユーザーのボックスの現在状態
    ・ステージ毎のボックスの中身を定義するマスタ
    

    さーばーえんじにあ「で、ユーザーのボックスの現在状態をどうやって保存するかちょっと悩むな。二つ案あるんだけど」

    案1:
    中身のコンテンツ一種類毎にレコードを作る
    利点: 
    ・構造が簡単。ユーザー動向の調査の為の検索や緊急対応の為の一括更新などがし易い。
    欠点:
    ・ユーザー一人辺りのデータが多くなる。総レコード数は簡単に考えて、(ユーザー数×ボックスガチャの数×ボックスガチャの平均コンテンツ種別量)となる
    ・10連でガチャったりする場合、SQLの更新回数が多い(O(n))
    
    案2:
    ボックスガチャ一つに対し、データをJSONなどで一括管理。
    利点:
    ・ユーザー一人辺りのデータが少ない。総レコード数は簡単に考えて(ユーザー数×ボックスガチャの数)となる。
    ・10連だろうと1連だろうとSQLの更新回数は1回(O(1))
    欠点:
    ・ユーザー動向の為の調査の為などの検索、緊急対応の為の一括更新がし辛い。JSONを生で保存するならlike検索などは辛うじて出来るが、圧縮してバイナリなどにした場合、全く出来なくなる
    ・管理、更新の為に毎回JSONなどを展開、圧縮などする必要がある為、やや面倒
    

    さーばーえんじにあ「……1だな! 2の欠点が、結構でかいからなぁ。ユーザー動向の調査とかはともかく、何か緊急対応しなきゃいけなくなった時、一括更新とか出来なくてユーザー一人一人に対して処理掛ける必要が出てきて、時間が酷く掛かったりとか、そんないやーな予感がする。
     データベース容量は結構余裕あるし、古いボックスガチャのデータとか、引き切ったボックスのデータとかはパーティション区切れば一括削除出来るし、ユーザー単位でそんな数百件もデータ保持しないだろ!
     それに、更新の為の計算量はO(n)だけど、最大10連とかだったら、1回での更新は最大10回だし、ちゃんとインデックス張れば大丈夫でしょ!
     ……まあ、設計書とかちゃんと作るとして」

    テーブル概要書

    マスタデータ
     ┣キャラクターマスタ CharacterMaster
     ┃┣キャラスキルマスタ CharacterSkillMaster
     ┃┣キャラ成長マスタ CharacterExpMaster
     ┃┃┗キャラパラメータマスタ CharacterParameterMaster
     ┃...
      ...
     ┣ガチャの親マスタ GachaMaster
     ┃┣ガチャの中身マスタ GachaContentMaster
     ┃┗ボックスガチャの中身マスタ <= new!
     ...
    
    
    ユーザーデータ
     ┣所持キャラクター群 Characters
     ...
     ┣現在のボックスガチャの状態データ群 <= new!
     ...
    

    記事を共有
    モバイルバージョンを終了