Skip to content

Instantly share code, notes, and snippets.

@todorok1
Created July 22, 2025 17:43
Show Gist options
  • Select an option

  • Save todorok1/6f9af334ef66eaffee906c938407564c to your computer and use it in GitHub Desktop.

Select an option

Save todorok1/6f9af334ef66eaffee906c938407564c to your computer and use it in GitHub Desktop.
シンプルRPGチュートリアル第112回 タイトル画面のつづきからのメニューを制御するクラス
using UnityEngine;
using System.Collections;
namespace SimpleRpg
{
/// <summary>
/// タイトル画面のつづきからのメニューを制御するクラスです。
/// </summary>
public class TitleContinueController : MonoBehaviour
{
/// <summary>
/// タイトル画面のメニューを管理するクラスへの参照です。
/// </summary>
TitleMenuManager _titleMenuManager;
/// <summary>
/// メニューのセーブ画面のUIを制御するクラスへの参照です。
/// </summary>
[SerializeField]
MenuSaveUIController _uiController;
/// <summary>
/// セーブデータの管理を行うクラスへの参照です。
/// </summary>
[SerializeField]
SaveDataManager _saveDataManager;
/// <summary>
/// 現在選択中のセーブ枠です。
/// </summary>
int _selectedSlot;
/// <summary>
/// セーブ枠の選択が可能かどうかのフラグです。
/// </summary>
bool _canSelect;
/// <summary>
/// セーブ枠が空の場合の名前です。
/// </summary>
readonly string EmptySlotName = "NO DATA";
/// <summary>
/// セーブ画面を開いた時の説明文です。
/// </summary>
readonly string LoadDescription = "ロードするファイルを選択してください。";
/// <summary>
/// コントローラの状態をセットアップします。
/// </summary>
public void SetUpController(TitleMenuManager titleMenuManager)
{
_titleMenuManager = titleMenuManager;
}
/// <summary>
/// セーブ枠の情報をセットします。
/// </summary>
public void SetUpSlotInfo()
{
// セーブ枠の情報をセットします。
_uiController.ClearAllSlot();
for (int i = 1; i <= SaveSettings.SlotNum; i++)
{
var saveSlot = _saveDataManager.GetSaveSlot(i);
if (saveSlot == null)
{
// セーブ枠が空の場合は、空欄の表示を行います。
_uiController.SetSlotInfoAsEmpty(i, EmptySlotName);
continue;
}
var statusInfo = saveSlot.saveInfoStatus;
if (statusInfo == null)
{
SimpleLogger.Instance.LogWarning($"セーブ枠のステータス情報が見つかりませんでした。 セーブ枠ID: {i}");
_uiController.SetSlotInfoAsEmpty(i, EmptySlotName);
continue;
}
int characterId = statusInfo.partyCharacter[0];
string characterName = CharacterDataManager.GetCharacterName(characterId);
int level = 1;
var status = statusInfo.characterStatuses.Find(s => s.characterId == characterId);
if (status != null)
{
level = status.level;
}
int mapId = 0;
if (saveSlot.saveInfoMap != null)
{
mapId = saveSlot.saveInfoMap.mapId;
}
string place = MapDataManager.GetMapName(mapId);
_uiController.SetSlotInfo(i, characterName, level, place);
}
}
void Update()
{
CheckKeyInput();
}
/// <summary>
/// キー入力を検知します。
/// </summary>
void CheckKeyInput()
{
if (_titleMenuManager == null)
{
return;
}
if (!_canSelect)
{
return;
}
if (Input.GetKeyUp(KeyCode.UpArrow))
{
SelectUpperItem();
}
else if (Input.GetKeyUp(KeyCode.DownArrow))
{
SelectLowerItem();
}
else if (InputGameKey.ConfirmButton())
{
OnPressedConfirmButton();
}
else if (InputGameKey.CancelButton())
{
OnPressedCancelButton();
}
}
/// <summary>
/// ひとつ上の項目を選択します。
/// </summary>
void SelectUpperItem()
{
int newIndex = _selectedSlot - 1;
if (newIndex < 1)
{
newIndex = SaveSettings.SlotNum;
}
_selectedSlot = newIndex;
PostSelection();
}
/// <summary>
/// ひとつ下の項目を選択します。
/// </summary>
void SelectLowerItem()
{
int newIndex = _selectedSlot + 1;
if (newIndex > SaveSettings.SlotNum)
{
newIndex = 1;
}
_selectedSlot = newIndex;
PostSelection();
}
/// <summary>
/// 選択後の処理を行います。
/// </summary>
void PostSelection()
{
ShowSelectionCursor();
}
/// <summary>
/// 選択中の位置に応じたカーソルを表示します。
/// </summary>
void ShowSelectionCursor()
{
_uiController.ShowCursor(_selectedSlot);
}
/// <summary>
/// 決定ボタンが押された時の処理です。
/// </summary>
void OnPressedConfirmButton()
{
_canSelect = false;
_titleMenuManager.OnSelectedSlotId(_selectedSlot);
}
/// <summary>
/// キャンセルボタンが押された時の処理です。
/// </summary>
void OnPressedCancelButton()
{
StartCoroutine(HideProcess());
}
/// <summary>
/// キャンセルボタンが押された時の処理です。
/// </summary>
IEnumerator HideProcess()
{
_canSelect = false;
yield return null;
_titleMenuManager.OnLoadCanceled();
HideWindow();
}
/// <summary>
/// セーブ画面を表示します。
/// </summary>
public void ShowWindow()
{
_uiController.Show();
_uiController.SetUpControllerList();
_uiController.SetDescription(LoadDescription);
_canSelect = false;
_selectedSlot = 1;
ShowSelectionCursor();
SetUpSlotInfo();
// セーブ画面を開いたフレームでボタンの検知をしないようにします。
StartCoroutine(SetSelectStateDelay());
}
/// <summary>
/// ステータス画面を閉じられるフラグをセットします。
/// </summary>
IEnumerator SetSelectStateDelay()
{
yield return null;
_canSelect = true;
}
/// <summary>
/// 選択ウィンドウを非表示にします。
/// </summary>
public void HideWindow()
{
_uiController.Hide();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment