前回まででセーブ&ロード処理を作りました。
前回の記事:
今回の記事ではついに2DRPG最後の仕上げとしてタイトル画面を実装していきます。
タイトル画面表示スクリプトの作成
それではまずスクリプトの方を作成していきます。
「TitleMenu.cs」というスクリプトを新しく作成してください。保存先はお好みでOKですが、記事ではAssets > Scriptsフォルダーに保存しています。
「TitleMenu.cs」の内容は次のものにしてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
//TitleMenu.cs TitleMenuコンポーネントの実装 using System.Collections; using System.Collections.Generic; using UnityEngine; public class TitleMenu : Menu { [SerializeField] protected RPGSceneManager RPGSceneManager; public void NewGame() { var savedData = Object.FindObjectOfType<SaveData>(); savedData.ClearSave(); RPGSceneManager.StartGame(); } public void Continue() { StartCoroutine(Load()); } IEnumerator Load() { var savedData = Object.FindObjectOfType<SaveData>(); if (!savedData.HaveSave) { RPGSceneManager.MessageWindow.StartMessage("セーブデータはありません..."); yield return new WaitUntil(() => RPGSceneManager.MessageWindow.IsEndMessage); yield break; } RPGSceneManager.Player.IsActive = true; savedData.Load(RPGSceneManager); yield return new WaitWhile(() => savedData.NowLoading); if(savedData.IsSuccessLoad) { RPGSceneManager.StartGame(); } else { RPGSceneManager.MessageWindow.StartMessage("セーブデータの読み込みに失敗しました..."); yield return new WaitUntil(() => RPGSceneManager.MessageWindow.IsEndMessage); } } } |
これと一緒に「RPGSceneManager」の方も修正していきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
//RPGSceneManager.cs タイトル処理の組み込み //次のものを追加 public TitleMenu TitleMenu; public void StartTitle() { StopCurrentCoroutine(); Player.gameObject.SetActive(false); if (ActiveMap != null) ActiveMap.gameObject.SetActive(false); TitleMenu.Open(); } public void StartGame() { StopCurrentCoroutine(); TitleMenu.Close(); Player.gameObject.SetActive(true); if (ActiveMap != null) ActiveMap.gameObject.SetActive(true); _currentCoroutine = StartCoroutine(MovePlayer()); } void StopCurrentCoroutine() { if (_currentCoroutine != null) { StopCoroutine(_currentCoroutine); _currentCoroutine = null; } } //次のものを修正 void Start() { StartTitle(); } |
単純にタイトルの時の操作とゲームプレイ中の操作を切り分けるようにしただけになります。
また、セーブデータを削除する処理も「SaveData」コンポーネントに追加するので、次のように修正してください。
1 2 3 4 5 6 7 8 9 10 11 |
//SaveData.cs セーブデータの削除処理の追加 //次のものを追加 public bool HaveSave { get => PlayerPrefs.HasKey("player"); } public void ClearSave() { PlayerPrefs.DeleteAll(); } |
スクリプトの修正は以上になります。
はじめからを選択したときは、シーンに配置している初期状態でゲームを始めるようにしています。
また、つづきからを選択したときはセーブした内容でゲームを再開するようにしています。
タイトル画面とゲーム画面の切り替え処理はそれぞれで想定しているシーン環境にする処理が追加されていますが、それ以外はシンプルなものになっているかと思います。
タイトルに必要なGameObjectの作成
次にタイトルに必要なGameObjectをシーンに配置していきます。
タイトル画面は次のような画像にします。
背景用の画像には次のものを使用しています。
背景用の画像にタイトルのテキストとメニュー項目をシーンに配置したものになります。
GameObjectの階層については次のようになっています。
- Title : UI > Canvas
- – TitleText : UI > Text
- – Commands : UI > Image
- – – NewGame : 「MenuItem」プレハブから作成
- – – Continue : 「MenuItem」プレハブから作成
この中の「Commands」はシーンの「MenuWindow > Commands」に内容が似ているので、コピーすると簡単に配置できます。
設定内容は次のようになっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
//タイトル画面のGameObjectの設定内容 ## Title : UI > Canvas - Canvasコンポーネント SortOrder : 50 - CanvasScalerコンポーネント UIScaleMode : ScaleWithScreenSize ReferenceResolution : 画面サイズに合わせたもの(記事では800x600) ※他のCanvasの設定に合わせた方がいいです。 - Imageコンポーネント <- 追加 Sprite : 背景用の画像を設定 - TitleMenuコンポーネント <- 追加 FirstMenuRoot : シーンの「Title > Commands」 RPGSceneManager : シーンの「RPGScene」 ## Title > TitleText : UI > Text - RectTransformコンポーネント Anchors Min:X=0, Y=0.5 Anchors Max:X=1, Y=1 Pivot:X=0.5, Y=1 Left=0, Right=0 Top=0 Bottom=0 - Textコンポーネント Text : Unity入門の森 2DRPGクエスト(仮) Alignment: 横=中央揃え、縦=中央揃え BestFit: true, MinSize=10, MaxSize=50 Color : 黒色(お好みOK) ## Title > Commands : UI > Image - RectTransformコンポーネント Anchors Min:X=0.4, Y=0.1 Anchors Max:X=0.6, Y=0.4 Pivot:X=0.5, Y=0.5 Left=0, Right=0 PosY=0 - Imageコンポーネント Color : 黒色 - VerticalLayoutGroupコンポーネント <- 追加 Padding :Left=0, Right=0, Top=0, Bottom=0 Spacing :0 ChildAlignment:UpperCenter ControlChildSize :Width=true, Height=false UseChildScale :Width=false, Height=false ChildForceExpand :Width=true, Height=false - ContentSizeFitterコンポーネント <- 追加 HorizontalFit : Unconstrained VertivalFit : PreferredSize - MenuRootコンポーネント <- 追加 ## Title > Commands > NewGame:「MenuItem」プレハブから作成 「Text」のText:はじめから - MenuItemコンポーネント CurrentKind : Event Callbacks : 「Title」の「TitleMenu.NewGame()」 ## Title > Commands > Continue:「MenuItem」プレハブから作成 「Text」のText:つづきから - MenuItemコンポーネント CurrentKind : Event Callbacks : 「Title」の「TitleMenu.Continue()」 |
また、「RPGSceneManager」コンポーネントも修正したのでシーンの「RPGScene」に次の設定を追加してください。
1 2 |
//RPGSceneの設定内容の追加 TitleMenu : シーンの「Title」 |
設定が終わったら実際に再生して動作を確認してください。次の画像のようになっていればOKです。
まとめ
今回の記事ではタイトル画面を作成しました。
単純にタイトル用のGameObjectとメニューを用意して、ゲームに移動するという簡単なものでしたが実装できましたか?
今回の内容をまとめると以下のようになります。
- タイトル画面用のスクリプトを作成
- タイトル用のGameObjectの作成
- タイトルと実際のゲームプレイ画面の移行処理を追加
今回で2DRPG講座の方は終わりますので、ここから先は色々改良してあなたオリジナルのRPGを作り上げてもらえたらと思います。
お疲れ様でした!
(加筆:スクリプトの数が多いのでスクリプトを全文掲載したページを一つ作成しました)
コメント