【Unity】RPGを作るチュートリアルその123 空のセーブ枠をロードできる問題に対処

【Unity】RPGを作るチュートリアルその123 空のセーブ枠をロードできる問題に対処

シンプルなRPGをUnityで作るチュートリアルシリーズの123回目です。

第122回ではエンディング後にタイトルに戻すイベントを実装しました。

今回はタイトル画面で空のセーブ枠をロードできてしまう問題を修正します。

 

 

制作環境

MacBook Pro 2023 Apple M2 Max

Unity6 (6000.0.30f1) Silicon

 

作業内容と順序

シンプルなRPGを作る上でどんな作業が必要か、どんな順番で作っていくと良さそうか、別ページで検討しました。基本的にこの流れに沿って進めていきます。

 

チュートリアルの一覧

このシリーズ全体の一覧は以下のページにまとめています。

 

前回の内容

前回はエンディング後にタイトルに戻すイベントを実装しました。

 

空のセーブ枠がロードできちゃう!

ビルドしてゲームを確認していて気付いたのですが、タイトル画面で空のセーブ枠を選択すると、ロードできてしまう問題に気付いてしまいました。

実はこの回を書く前はWebGLでビルドをしており、セーブファイルがない環境で実行していたところ今回の問題に気付きました。いつもの開発環境だとセーブ枠が埋まっていたので気付いていませんでした……。開発中のこうしたうっかりについては気をつけていかないとですね(反省)

というわけで、今回はこの問題に対処したいと思います。対応の方向としては、空のセーブ枠がある場合は、グレーアウトして選択できないようにしていきます。

 

スクリプトの修正

修正の内容としては、

  • 空のセーブ枠のテキストをグレーアウトする
  • 空のセーブ枠にカーソルがある時に決定ボタンを押しても先に進まないようにする

といった点を盛り込みたいと思います。

修正の対象クラスは、

  • MenuSaveSlotController
  • MenuSaveUIController
  • TitleContinueController

です。順番に修正していきます。

 

MenuSaveSlotControllerの修正

「MenuSaveUIController」のクラスでは、

  • 選択できる時とできない時の色の定義の追加
  • テキストフィールドの色を設定するメソッドの追加

を行います。

まずは色の定義のフィールドを追加します。既存の「_placeText」のフィールドの下に、選択できる時の色、選択できない時の色のフィールドを追加します。

お店やアイテム画面の選択項目と同じように、Inspectorウィンドウから色を設定できるようにしてあります。インスタンス化された項目それぞれで設定するのは大変なので、Prefab側で一括変更することを想定しています。

 

既存のClearSlotInfoText()の下に、テキストに色を設定するメソッドのSetTextColor()を追加します。このメソッド内で各テキストに色をセットするようにして、引数で色を渡せるようにします。

SetEnabledColor()は選択できる時の色をSetTextColor()に渡し、SetDisabledColor()は選択できない時の色を渡します。

 

MenuSaveUIControllerの修正

「MenuSaveUIController」のクラスでは、セーブ枠の情報をセットする際に先ほど作成したSetEnabledColor()を呼び出し、空のセーブ枠の情報をセットする際にSetDisabledColor()を呼び出すようにします。

どちらも既存のメソッド内で処理を追加します。

セーブ枠が選択できる時にはSetSlotInfo()のメソッドが呼ばれるので、こちらからSetEnabledColor()を呼び出すようにします。

セーブ枠が選択できない時にはSetSlotInfoAsEmpty()のメソッドが呼ばれるので、同様にSetDisabledColor()を呼び出すようにします。

 

TitleContinueControllerの修正

「TitleContinueController」のクラスでは、

  • セーブ枠がロードできるかどうか判定するメソッドの追加
  • 決定ボタンを押した時にロードできるかどうかで分岐を追加

を行います。

既存のOnPressedConfirmButton()のメソッドの前に、選択されているセーブ枠がロードできるかどうかを判定するCanLoadSlot()のメソッドを追加します。このメソッドでは、セーブ枠の情報がnullの場合や、ステータス情報がない場合にロードできないと判断してfalseを返すようにします。

OnPressedConfirmButton()では、CanLoadSlot()を使ってロードできるかどうかを判定して、ロードできない場合は処理を抜けます。

 

動作確認

スクリプトファイルを保存したら「Title」シーンからゲームを実行します。タイトルメニューにて「つづきから」を選択して、

  • 空のセーブ枠のテキストがグレーアウトされていること
  • カーソルを合わせて決定ボタンを押してもロードできないこと

を確認します。

グレーアウトされて選択できないようになった
グレーアウトされて選択できないようになった

 

もし3つともセーブ枠が埋まっている場合は、セーブファイルをバックアップした上で、ファイルを削除して確認しましょう。

セーブファイルのパスについては、「SaveDataUtil」のクラスにて「Application.persistentDataPath」を使用して生成しています。保存される場所はOSによって異なるので、スクリプトリファレンスを参考に探していただくと良いかと思います。

 

今回のブランチ

 

まとめ

今回はタイトル画面で空のセーブ枠をロードできてしまう問題を修正しました。実行する環境を変えることでも気付くことがあるので、エディタに加えてもう2環境くらいリリースビルドを作ってみるのも良いかもしれません。

次回は配布を見据えてWebGLのビルドを行いますが、その前にローカルでWebGLのビルドを確認できるようにDockerの環境を用意しつつ、WebサーバとしてApacheを使用する準備をしていきたいと思います。

 

     

ゲーム開発の攻略チャートを作りました!

CTA-IMAGE

「ゲームを作ってみたいけど、何から手を付けていいか分からない!」


そんなお悩みをお持ちの方向けに、todoがアプリをリリースした経験を中心に、ゲーム作りの手順や考慮すべき点をまとめたe-bookを作成しました。ゲーム作りはそれ自体がゲームのように楽しいプロセスなので、「攻略チャート」と名付けています。


ゲームを作り始めた時にぶつかる壁である「何をしたら良いのか分からない」という悩みを吹き飛ばしましょう!