ダンスゲーを作りたい#30 【内部処理】データの基本的な管理方法の案
さて、今回からはそこそこまとめてちゃんと1からゲーム作っていこうという感じですが、
今回はとりあえずデータの取り扱いを明確にしておきたいと思います。
ソシャゲ様のゲームを想定しているので、データはある程度サーバと通信しながら行いますが、端的に言えばサーバの存在はコストでしかありません。
金はかけたくないのが根本的方針なので、サーバ費用は最低限に抑えたいところなわけで、サーバにもあんまりデータを貯めたくはないわけです。
かといってすべてローカルで保存していては不正対策としては不十分なんでしょう。
そこで、ある程度セキュアでコストを減らす仕組みを考えました。
不正に対し、あきらめる部分と対策
究極にセキュアさを保ちたいなら、構成はこうすればいいでしょう
各端末には一切データを持たせず、表示可能な画面を返してやりたいことだけリクエストさせ、その処理によって変化した画面を返せばいいんじゃないでしょうか。
しかし、これはサーバにものすごい負荷がかかり、ものすごい量のデータがたまる仕組みです。
それに、サーバがぶっ壊れでもしたら全てが終わります。
仕事で数万件レベルのデータサーバが何百GBレベルでデータ食うのを見て、絶対個人では管理しないと胸に誓いました。
金をかけずに遊びたいだけの個人開発レベルでは現実的ではないですしね。
そこで、データそのものは各自の端末に保存させ、変更等はサーバで全部やる仕組みにします。
これで、ローカルのセーブデータを編集した場合はハッシュ不一致でサーバからのコンテンツデータを受け取れません。
サーバにはハッシュが保存されるだけなのでデータもかさみません。
このシステムでは、ローカル環境内での不正は簡単ですが、自分で楽しむ分には好きにしたらいいと思うんですよね。
不正対策として必要なラインは、ランキング等ユーザ間で競うデータの不正対策と課金して手に入れるようなコンテンツを無料で引き出される対策くらいで、プレイがサクサク進むとかその程度の不正は正直別にいいと思います。
データはローカル管理なのでデータが消えても自分のせいです。運営のせいじゃありません。サーバのハッシュが消えてもデータ自体は消えないので復旧可能です。
ゲーム内でのデータ管理
ここまででざっくり全体のデータのやり取りを書きましたが、ここからはアプリ内でのデータの受け渡し方式を書きます。
アプリ内ではまずデータマネージャを用意し、そいつがデータを全部管理します。スクリプトからデータを使いたいときはデータマネージャを呼び出す格好です。
データマネージャ内では大きくこの分類でデータを管理します。
それぞれデータの読み書き方法とかに差異があるため、全部をマネージャにまとめてスクリプトからのアクセス記述を画一化してしまおうという考えです。
個別のデータを形づくるクラスはこれらの分類に基づく抽象クラスを継承して同じ形で呼び出せるようにさせます。
イメージ的にはサーバデータを例にこんな感じってことです。
サーバから取得するデータの抽象クラス
なんかsource説明するのめんどいのでやってることだけ図で説明します。
実際には先に紹介した図の感じですが、便宜上個々のデータクラスは省略します。
要は非同期でロード画面を表示させて処理を止めておき、スクリプトではUpate()を呼んだ後は更新されたデータになっていて逐次処理できるというものです。
サーバで変更がないか確認するデータの抽象クラス
サーバと同じように呼び出せばいいだけですが、使う際にもデータが変更されていないか一応確認します。
内容は違いますが呼び出し方は同じです。
ただのローカルデータの抽象クラス
これはニュアンスがちょっと違いますが、変更状況を保存してセーブデータと読み出してるデータを同期するみたいな処理を挟んでおいてるって感じです。
別に内容はなくてもいいと思います。
データの変更処理
データの変更自体はデータマネージャ自身が管理を行います。
"値を1から2に変更したい"みたいな形式ではなく、"OOの処理をしたい"というリクエストだけを送信し、具体的な値の計算は全部サーバに任せます。
以上の仕組みでデータは管理しようという基本理念です。
これである程度楽になりますが、ただのローカルデータだけは直接クラスの値を変更する必要があります。
これは、作ってる今は判別できるのでいいですが、そのうちどれが何かわからなくなって困りそうなので課題ですね。
この記事が気に入ったらサポートをしてみませんか?