Mvc アイデアを使用して、バックパック プロップ データ (プロップ名、プロップ UI ピクチャ) 情報を Scriptable クラスを継承するインスタンス化されたオブジェクトに保存し、InventoryManager を使用して各プロップ オブジェクトのアイテムと関連するアイテム セットを管理および制御します。 props 情報により、在庫マネージャーはどの品目 (props) を知ることができます。
MVC とは:
M は Model (モデル)
V は View (ビュー)
C は Control (制御) であり
、MVC を使用する目的は、論理的な区別のために M と V コードを分離することです。
すべてのプロパティの名前を列挙型クラス Enums.cs に格納し、一時的に Key を書き込みます
/// <summary>
/// 每个道具的名字
/// </summary>
public enum ItemName
{
None,
Key,
// .....
}
InventoryManager.cs は、クリックされたプロップ名を保存する責任があります。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class InventoryManager : Singleton<InventoryManager>
{
// [SerializeField]使私有化的字段可以在inspector面板中被看见
[SerializeField] private List<ItemName> itemNames;
private void Start()
{
itemNames = new List<ItemName>();
}
public void AddItem(ItemName itemName)
{
// 如果背包中不存在此物体则添加进去
if (!itemNames.Contains(itemName))
{
itemNames.Add(itemName);
// 根据当前的item显示对应的ui图标
}
}
}
対応するコリジョン ボディをシーン内のプロップに追加し、IsTrigger をチェックし、スクリプト item.cs を追加します。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Item : MonoBehaviour
{
public ItemName itemName;
// 根据item的名字添加背包的数据
public void AddItem()
{
// 使用单例来添加该item的数据到总体的数据中
InventoryManager.Instance.AddItem(this.itemName);
// 设置为不可见
this.gameObject.SetActive(false);
}
}
各プロパティ情報を格納する ItemDataList_SO.cs 、ScriptableObjectを継承し、
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// 使project面板右键增加scriptbale文件
[CreateAssetMenu(fileName = "ItemDataList_SO", menuName = "Inventory/ItemDataList_So")]
public class ItemDataList_SO : ScriptableObject
{
//
public List<ItemDetails> itemDetailsList;
// 获取对应的item的信息
public ItemDetails GetItemDetails(ItemName itemName)
{
return itemDetailsList.Find(i => i.itemName == itemName);
}
}
/// <summary>
/// 存储每个item对应的详细信息, 使之可见在inspector面板上
/// </summary>
[System.Serializable]
public class ItemDetails
{
public ItemName itemName;
public Sprite itemSprite;
}
最後に、先ほどのCursorManager.csの関数ClickAction(GameObject clickObject)を修正し、タグがItemであるアイテムの操作を追加します。
public void ClickAction(GameObject clickObject)
{
switch (coll.gameObject.tag)
{
case "Teleport":
// 获取对象上的Teleport组件,执行场景切换方法
Teleport t = clickObject.GetComponent<Teleport>();
t?.TransitionScene();
break;
case "Item":
Item item = clickObject.GetComponent<Item>();
item?.AddItem();
break;
default:
break;
}
}