《迷失岛2》游戏开发框架开发日记:背包基本逻辑

使用mvc思想,将背包道具数据(道具名、道具ui的图片)信息存放在继承了Scriptable类的实例化对象中,然后用InventoryManager去管理和控制每个道具对象上的Item,Item设置相关的道具信息可以让InventoryManager知道是哪一个Item(道具)。

什么是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),添加对Tag为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;
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值