Skip to content

Instantly share code, notes, and snippets.

@todorok1
Last active April 22, 2025 12:00
Show Gist options
  • Select an option

  • Save todorok1/04d1a6f994166e4620fc08000b4ed5f8 to your computer and use it in GitHub Desktop.

Select an option

Save todorok1/04d1a6f994166e4620fc08000b4ed5f8 to your computer and use it in GitHub Desktop.
シンプルRPGチュートリアル第69回 メニューウィンドウにてアイテムに関する処理を制御するクラス
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
namespace SimpleRpg
{
/// <summary>
/// メニューウィンドウにてアイテムに関する処理を制御するクラスです。
/// </summary>
public class MenuItemWindowItemController : MonoBehaviour
{
/// <summary>
/// メニュー画面のアイテムウィンドウを制御するクラスへの参照です。
/// </summary>
MenuItemWindowController _windowController;
/// <summary>
/// 項目オブジェクトとアイテムIDの対応辞書です。
/// </summary>
Dictionary<int, int> _itemIdDictionary = new();
/// <summary>
/// 1ページあたりのアイテム表示数です。
/// </summary>
int _itemInPage;
/// <summary>
/// 有効なアイテム情報のリストです。
/// </summary>
List<PartyItemInfo> _validPartyItemInfoList = new();
/// <summary>
/// 参照をセットアップします。
/// </summary>
/// <param name="windowController">メニューウィンドウを制御するクラス</param>
public void SetReferences(MenuItemWindowController windowController)
{
_windowController = windowController;
}
/// <summary>
/// ページ内に表示するアイテム数をセットします。
/// </summary>
/// <param name="itemNum">ページ内のアイテム数</param>
public void SetItemsInPage(int itemNum)
{
_itemInPage = itemNum;
}
/// <summary>
/// 有効なアイテム情報のリストをセットします。
/// </summary>
public void InitializeItemInfo()
{
_validPartyItemInfoList.Clear();
// アイテムデータに対応するIDがあるものをリストに追加します。
foreach (var partyItemInfo in CharacterStatusManager.partyItemInfoList)
{
if (partyItemInfo == null)
{
continue;
}
var itemData = ItemDataManager.GetItemDataById(partyItemInfo.itemId);
if (itemData == null)
{
SimpleLogger.Instance.LogWarning($"アイテムデータが見つかりませんでした。 ID: {partyItemInfo.itemId}");
continue;
}
_validPartyItemInfoList.Add(partyItemInfo);
}
}
/// <summary>
/// ページ内に存在するアイテム数を取得します。
/// </summary>
public int GetPageItemCount()
{
return _itemIdDictionary.Count;
}
/// <summary>
/// インデックスが有効な範囲か確認します。
/// </summary>
/// <param name="index">確認するインデックス</param>
public bool IsValidIndex(int index)
{
bool isValid = index >= 0 && index < _validPartyItemInfoList.Count;
return isValid;
}
/// <summary>
/// 選択中の項目が実行できるか確認します。
/// 魔法の場合は消費MPを確認、アイテムの場合は所持数を確認します。
/// </summary>
/// <param name="selectedIndex">選択中のインデックス</param>
public bool IsValidSelection(int selectedIndex)
{
bool isValid = false;
int indexInPage = selectedIndex % _itemInPage;
if (!_itemIdDictionary.ContainsKey(indexInPage))
{
return isValid;
}
var itemId = _itemIdDictionary[indexInPage];
var partyItemInfo = _validPartyItemInfoList.Find(info => info.itemId == itemId);
isValid = partyItemInfo.itemNum > 0;
return isValid;
}
/// <summary>
/// 最大ページ数を取得します。
/// </summary>
public int GetMaxPageNum()
{
int maxPage = Mathf.CeilToInt(_validPartyItemInfoList.Count * 1.0f / _itemInPage * 1.0f);
return maxPage;
}
/// <summary>
/// 現在のページが有効な範囲か確認します。
/// </summary>
/// <param name="currentPage">現在のページ</param>
public int VerifyPage(int currentPage)
{
if (currentPage >= 0 && currentPage < GetMaxPageNum())
{
return currentPage;
}
else if (currentPage < 0)
{
return 0;
}
else
{
return GetMaxPageNum() - 1;
}
}
/// <summary>
/// 選択中のインデックスを有効な範囲に補正します。
/// </summary>
/// <param name="index">補正するインデックス</param>
public int VerifyIndex(int index)
{
if (IsValidIndex(index))
{
return index;
}
return _validPartyItemInfoList.Count - 1;
}
/// <summary>
/// ページ内のアイテムの項目をセットします。
/// </summary>
/// <param name="page">ページ番号</param>
/// <param name="uiController">UIの制御クラス</param>
public void SetPageItem(int page, MenuItemUIController uiController)
{
_itemIdDictionary.Clear();
int startIndex = page * _itemInPage;
for (int i = startIndex; i < startIndex + _itemInPage; i++)
{
int positionIndex = i - startIndex;
if (i < _validPartyItemInfoList.Count)
{
var partyItemInfo = _validPartyItemInfoList[i];
var itemData = ItemDataManager.GetItemDataById(partyItemInfo.itemId);
if (itemData == null)
{
SimpleLogger.Instance.LogWarning($"アイテムデータが見つかりませんでした。 ID: {partyItemInfo.itemId}");
continue;
}
string itemName = itemData.itemName;
int itemNum = partyItemInfo.itemNum;
bool canSelect = CanSelectItem(partyItemInfo);
uiController.SetItemText(positionIndex, itemName, itemNum, canSelect);
_itemIdDictionary.Add(positionIndex, itemData.itemId);
}
else
{
uiController.ClearItemText(positionIndex);
}
}
if (_itemIdDictionary.Count == 0)
{
uiController.ClearDescriptionText();
}
}
/// <summary>
/// 引数のインデックスに対応するアイテムの説明をセットします。
/// </summary>
/// <param name="selectedIndex">選択されたインデックス</param>
/// <param name="uiController">UIの制御クラス</param>
public void SetItemDescription(int selectedIndex, MenuItemUIController uiController)
{
if (!IsValidIndex(selectedIndex))
{
return;
}
var partyItemInfo = GetItemInfo(selectedIndex);
if (partyItemInfo == null)
{
return;
}
int itemId = partyItemInfo.itemId;
var itemData = ItemDataManager.GetItemDataById(itemId);
if (itemData != null)
{
uiController.SetDescriptionText(itemData.itemDesc);
}
}
/// <summary>
/// アイテムを使えるか確認します。
/// </summary>
/// <param name="itemId">アイテムID</param>
bool CanSelectItem(PartyItemInfo partyItemInfo)
{
if (partyItemInfo == null)
{
return false;
}
var itemData = ItemDataManager.GetItemDataById(partyItemInfo.itemId);
if (itemData == null)
{
return false;
}
if (itemData.itemCategory != ItemCategory.ConsumableItem)
{
return false;
}
return true;
}
/// <summary>
/// 選択されたインデックスに対応するアイテム情報を取得します。
/// </summary>
/// <param name="selectedIndex">選択されたインデックス</param>
public PartyItemInfo GetItemInfo(int selectedIndex)
{
PartyItemInfo itemInfo = null;
if (selectedIndex >= 0 && selectedIndex < _validPartyItemInfoList.Count)
{
itemInfo = _validPartyItemInfoList[selectedIndex];
}
return itemInfo;
}
/// <summary>
/// アイテムの使用処理が終わった時のコールバックです。
/// </summary>
public void OnFinishedItemProcess()
{
InitializeItemInfo();
_windowController.PostAction();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment