学習記事一覧 · Unity

【学習】Unity:アイテム所持とセーブ入門(第5回)― フィールドから反映:ItemOnTriggerEnter

第4回 で、所持データの共有と保存の土台はできました。

いよいよ ゲーム内のオブジェクトから、そのデータに 書き込みします。

典型は次の流れです。

プレイヤーがアイテムに触れる → 個数が増えるセーブフィールド上のオブジェクトは消える

書籍サンプルでは Item.csMonoBehaviour がこの入口です。

シリーズ


今日のゴール

  • 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回の課題②」として切り出す

このシリーズのあと


シリーズに戻る

目次(00)