『ロストアイランド2』ゲーム開発フレームワーク開発日記:バックパックの基本ロジック

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;
        }
    }

Guess you like

Origin blog.csdn.net/weixin_44848852/article/details/127168665