【学習】Unity:アイテム所持とセーブ入門(第5回)― フィールドから反映:Item と OnTriggerEnter
第4回 で、所持データの共有と保存の土台はできました。
いよいよ ゲーム内のオブジェクトから、そのデータに 書き込みします。
典型は次の流れです。
プレイヤーがアイテムに触れる → 個数が増える → セーブ → フィールド上のオブジェクトは消える
書籍サンプルでは Item.cs(MonoBehaviour) がこの入口です。
シリーズ
- 目次(00)
- 前回: 第4回
- 第5回(本記事):
Item取得からSaveまで- 次回(UI編): 第6回:ItemButton とスロットの見た目
今日のゴール
OnTriggerEnterで プレイヤーだけを判定する(CompareTag)OwnedItemsData.Instance.Add(type)のあとSave()を呼ぶDestroy(gameObject)で ワールド上の重複取得を防ぐ- 出現アニメーションや DOTween は「伸ばしどころ」として切り離してよい、と割り切れる
シーン側の前提(最低限)
- アイテム側
Collider(教材では Is Trigger を想定しがち) - プレイヤーに
Rigidbodyなど、Trigger 成立のための条件を満たす(プロジェクトの設定に合わせる) - プレイヤーに Tag
Player
Item のコア(取得処理の心臓部)
次の形がわかれば、シリーズの目的は達成です。
using UnityEngine;
[RequireComponent(typeof(Collider))]
public class Item : MonoBehaviour
{
public enum ItemType
{
Wood,
Stone,
ThrowAxe
}
[SerializeField] private ItemType type;
private void OnTriggerEnter(Collider other)
{
if (!other.CompareTag("Player"))
{
return;
}
OwnedItemsData.Instance.Add(type);
OwnedItemsData.Instance.Save();
foreach (var item in OwnedItemsData.Instance.OwnedItems)
{
Debug.Log(item.Type + "を" + item.Number + "個所持");
}
Destroy(gameObject);
}
}注
上記は 教材用に整理した抜粋です。書籍サンプルにはInitialize(DOTween でスケールアニメし、Colliderを一時無効化する等)が含まれます。いきなり全部は入れず、まずOnTriggerEnterの流れを確実にするとよいです。
プログラムの流れ
プレイヤーが Trigger に入る
↓
Tag が Player か?
↓ No なら何もしない
↓ Yes
Instance で Add(種類ごとに個数加算)
↓
Save(JSON を PlayerPrefs へ)
↓
(確認用)ログ
↓
Destroy でフィールドから消す重要ポイント
Instanceは「どのスクリプトからでも同じデータ」 … UI・敵・ギミックと衝突しないように、更新と保存のルール(いつSaveするか)を授業で決めるUseで例外を投げる実装を採用する場合は、UI から呼ぶときに try-catch や事前チェックが必要になる(設計の話につながる)- ログの
foreachは学習用。本番に近づけるなら UI 表示や イベントに差し替える
発展アイデア
- UI に所持数を表示する(Text / UI Toolkit)
ItemTypeを増やし、Add後に 実績や 演出を足す- アニメーションを戻すなら、書籍の
Initializeを「第5回の課題②」として切り出す
このシリーズのあと
- 第6回:ItemButton とスロットの見た目 … 書籍 8-4-3 相当の
ItemButton/ItemsDialog/Menuのステップ講義の入口 - いきのこバトル:所持品データとオーディオ … 書籍準拠の 全文コードと UI・SE への接続
- OOP:シングルトン …
Lazy<T>版など設計の幅
シリーズに戻る
→ 目次(00)