【学習】Unity:アイテム所持とセーブ入門(第1回)― メモリだけの所持:Dictionary で増減
これまでの学習では、変数に値を入れて表示する、といった形でプログラムを動かしてきたと思います。
しかしゲームでは、種類が増えても同じ書き方で表したいデータがあります。典型例が 所持アイテム です。
名前 と 個数 のセットを、たくさん管理する。
今回は、その最小形として Dictionary<string, int> を使い、メモリ上だけで「増える・減る」を体験します(まだ保存はしません)。
シリーズ
- 目次(00)
- 第1回(本記事):
Dictionaryでメモリ上の所持管理- 次回: 第2回:クラスと
Listで整理する
今日のゴール
- ポーションを 3 個、鍵を 1 個 のように、名前と個数で管理できる
AddItemで増え、UseItemで減る(足りないときはメッセージ)Dictionaryは「キーと値のペアをまとめる箱」 だと言える
準備
- 空のシーンと、適当な
GameObject(名前例:ItemLab) - 新規スクリプトを作成し、下記のコードに差し替える
完成コード
using System.Collections.Generic;
using UnityEngine;
public class SimpleItemManager : MonoBehaviour
{
private Dictionary<string, int> items = new Dictionary<string, int>();
public void AddItem(string itemName, int count)
{
if (!items.ContainsKey(itemName))
{
items[itemName] = 0;
}
items[itemName] += count;
Debug.Log(itemName + " を " + items[itemName] + " 個持っています");
}
public void UseItem(string itemName, int count)
{
if (!items.ContainsKey(itemName) || items[itemName] < count)
{
Debug.Log("アイテムが足りません");
return;
}
items[itemName] -= count;
Debug.Log(itemName + " を使いました。残り " + items[itemName] + " 個");
}
}手を動かす(ここ重要)
- スクリプトを
GameObjectにアタッチする - Play して動作を確認する
例:Start で試す
private void Start()
{
AddItem("ポーション", 3);
UseItem("ポーション", 1);
}例:Inspector から試す(任意)
SimpleItemManager に [ContextMenu] を付けてメニューから呼ぶ、などでも構いません。
プログラムの流れ
AddItem が呼ばれる
↓
その名前のキーがなければ 0 で初期化
↓
個数を加算してログ
UseItem が呼ばれる
↓
キーがない/個数不足ならログして return
↓
減算してログ重要ポイント
Dictionary<string, int>… キーが アイテム名(文字列)、値が 個数(整数)ContainsKey… まだそのアイテムを持ったことがないか確認する- この段階では Play を止めるとデータは消える(メモリ上だけ)ことも、あえて実験してみてください
発展アイデア
foreachでitemsの中身をすべてDebug.Logする(一覧表示の予習)- 負の個数にならないよう
UseItem内でガードする(すでにしている場合はスキップ)
次に進む
同じ名前のまとめ方はこれで体験できました。次回は 1 アイテムをクラスにし、将来の 説明文・アイコン などに備えます。