Unityで個人開発中のゲームにセーブ機能を実装してみた
こんにちは、「仕様です。」(@shiyoumasayume)という名前でSNSをやっているゲームプランナーです。
普段は会社でたくさんの人と一緒にコンシューマー向けタイトルの開発をしているのですが、最近では在宅での仕事も増え、結果として自分の自由な時間が増えました。そこで勉強も兼ねて普段の業務では作れないようなゲームを個人開発したりしています。
さて、この記事では作成中のゲームを例に
「ゲーム開発者がセーブ/ロード機能を作るときの考え方」
をまとめてみようと思います。
このnote単体で読んでいただいても大丈夫ですが、作っているゲームについての詳細を知りたいという方は開発内容まとめなどを見ていただけると嬉しいです!
作成中のゲーム「Dr.Holeking」についての全記事はこちら
開発に使うもの
PC
・MacBook Air 2020 13インチモデル
・第10世代の1.2GHzクアッドコアIntel Core i7プロセッサ
・Intel Iris Plus Graphics
・16GB 3,733MHz LPDDR4Xメモリ
・1TB SSDストレージ
ゲームエンジン
・Unity バージョン2020.1.2f1
Google chrome
・調べ物をするときに
Twitter / note
・経過報告用
Macbook AirにUnityというツールを入れてゲームを作成しています。
ノートPCが1台だけで開発というたいへんコンパクトな装備です。
作ろうとしているゲームの概要
今回作っている「Dr.Holeking」というゲームはこんな要素を持っています。
・ポストアポカリプス(崩壊後の世界)なSFモノ
・基地のリソースを管理して襲来する敵を倒す
・敵を倒して得たリソースを使って基地の地下を掘削し、地球の核へと到達する
・iPhoneの縦持ちでプレイ
プレイヤーが遊ぶときの流れはこんな具合です。
1.基地のリソースを消費して基地設備を整える
2.襲来する敵を倒す
3.敵を倒して得たリソースでさらに基地を増築or地面の掘削を進める。
敗北条件:所有する基地の設備が襲来する敵を倒しきれなかった
クリア条件:特定の深度まで掘削を進めた
セーブ機能の要件を考える
セーブ機能を用意するにあたって決めておきたいのは3つです。
・どのタイミングでセーブをするか
・どのタイミングでロードをするか
・何をセーブするか
どのタイミングでセーブをするか
特にセーブボタンなどは設けず、ゲーム中にエネルギーや基地設備などリソースの更新が行われた段階でオートセーブされるようにします。Dr.Holekingというゲームは「基地設備拡張→戦闘」という2画面のシーケンスだけで構成されるため、区切りが明確かつ変なところでオートセーブが起きて詰むということは無いだろうということで、プレイヤーにセーブさせるという手間をなくすことにしました。
(ただしこれは最終的なかたちで、オートセーブされるとチェックが面倒なので開発中は「S」キーで手動でセーブ処理を呼び出すようにします)
どのタイミングでロードをするか
ゲームを再開するときに一番最後に保存されたセーブを読み込みます。特に複数のセーブデータを持つということはせずゲームを閉じたら勝手にセーブされていて、開いたらまたその続きからすぐ始められるというシーケンスにしていきます。
(ただしこれも最終的なかたちで、開発中は「L」キーで手動でロード処理を呼び出すようにします)
何をセーブするか
ゲームの進行度にかかわるものを洗い出して、それを全て保存します。
・現在の基地レベル
・所持エネルギー量(ゲーム内通貨)
・配備している兵士の量
・配備している罠の量
・配備している餌の量
・敵が攻めてくるまでのターン数
プレイヤーの行動として積み重ねたものはすべて保存しています。その中で気をつけないといけないのは、敵が攻めてくるまでのターン数です。これを保存していないとゲームを開始する度にターン数がリセットされるため、ゲームの起動を繰り返すことで全く敵が攻めてこなくなることになってしまいます…。
実装してみた
「S」キーを押した時点での状態を保存しており、「L」キーを押すとそれを呼び出すことができます。動画内のようにゲームプレイを終了した後でも呼び出しは可能となっています。手動で呼び出しているセーブ・ロード機能をゲーム中に自動的に呼び出せるようにすればオートセーブ・ロードを作ることもできそうです。
ちなみにプランナーの方に向けて実装時の考え方を提示しますと、こんなかんじです。
セーブ:
保存したい変数の内容を決めたらJASON用の変数に保存する。
セーブ関数を作り、それを任意のタイミングで呼び出す。
ロード:
JASON用に保存した変数にアクセスして、その内容でゲーム中の変数を上書き。その変数でUI表示などを更新する。セーブと同様にロード関数を作り、それを任意のタイミングで呼び出す。
こちらのページを参考にさせていただきました。
というわけで
ゲーム開発者がセーブとロード機能を用意する際の考え方についてまとめました。
さてこのゲームは週毎に期日や作業内容を決めて進めています。
今回期日
・9月13日(日)
作業項目
セーブ機能の作成
なんとかなりました!
この調子で完成を目指していきます。次回からの作業は、
次回期日
9月20日(日)
作業項目
・ゲーム内に登場する敵の種類を設計する
・基地設備強化の拡張処理を実装する
ゲームコンテンツの詳細化を進めていきます。
現在は攻めてくる敵が仮で用意した2種類しかいないため、ゲーム全体のボリュームなどをもとに他の種類の敵を設計していきます。このあたりはゲームバランス設計の考え方など含めて紹介できればと思います。
基地設備強化の拡張処理は、その話題が出た時に改めて。
引き続き開発を進めていきますので、見守っていただけると幸いです。
続きが気になる方はこちら!
ここまで読んでいただきありがとうございました!
よろしければコメント、スキ、フォローお願い致します!
Twitterもやっていますのでよろしければこちらでも絡んでいただけると嬉しいです。
https://twitter.com/shiyoumasayume
他にも色々な記事を書いています。
よろしければサポートお願いします!いただいたサポートをモチベーションにまた活動を続けていきます