【制作100个unity游戏之25】3D背包、库存、制作、快捷栏、存储系统、砍伐树木获取资源、随机战利品宝箱7(附带项目源码)

简介: 【制作100个unity游戏之25】3D背包、库存、制作、快捷栏、存储系统、砍伐树木获取资源、随机战利品宝箱7(附带项目源码)

前言

欢迎来到【制作100个Unity游戏】系列!本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第25篇中,我们将探索如何用unity制作一个3D背包、库存、制作、快捷栏、存储系统、砍伐树木获取资源、随机战利品宝箱等功能,我会附带项目源码,以便你更好理解它。

新增简单的泛型单例

我们会有有很多单例,如果每个单例都去写会很麻烦,所以我们定义泛型单例模式 Singleton,我们将所有的单例都继承这个泛型单例,就省略很多重复的工作

//简单的泛型单例
public class Singleton<T> : MonoBehaviour where T : Singleton<T>
{
    private static T instance;

    public static T Instance
    {
        get
        {
            if (instance == null)
            {
                instance = FindObjectOfType<T>();
                if (instance == null)
                {
                    GameObject obj = new GameObject(typeof(T).Name);
                    instance = obj.AddComponent<T>();
                }
            }
            return instance;
        }
    }

    public void Awake() {
        if(instance == null){
            instance = this as T;
            //确保单例对象在场景切换时不会被销毁
            DontDestroyOnLoad(gameObject);
        }else{
            Destroy(gameObject);
        }
    }
}

调用例子:

public class MySingletonClass : Singleton<MySingletonClass>
{
    // 添加自己的方法和属性
}

消耗品

新增玩家健康类控制脚本

public class PlayerHealth : MonoBehaviour
{
    [SerializeField] private int health = 0; // 玩家健康值
    [SerializeField] private int food = 0;   // 玩家食物值
    [SerializeField] private int water = 0;  // 玩家水分值

    // 增加健康值
    public void AddHealth(int addedHealth)
    {
        health += addedHealth;
    }

    // 增加食物值
    public void AddFood(int addedFood)
    {
        food += addedFood;
    }

    // 增加水分值
    public void AddWater(int addedWater)
    {
        water += addedWater;
    }
}

因为物品都会配置为预制体,如果我们直接在物品上挂载配置触发的事件,变为预制体后事件配置数据会丢失,所以我们可以新增物品事件管理器类ItemEventManager ,动态的绑定相关事件到对应物品上

// 物品事件管理器类
public class ItemEventManager : Singleton<ItemEventManager>
{
    [SerializeField] private List<ItemReferences> itemReferences = new List<ItemReferences>(); // 物品引用列表

    // 获取物品事件
    public UnityEvent GetItemEvents(Item item)
    {
        ItemReferences itemRef = itemReferences.Find(x => x.item.name == item.name); // 查找物品引用
        return (itemRef != null && itemRef.events != null) ? itemRef.events : null; // 返回物品事件,如果为空则返回 null
    }
}

// 物品引用类
[System.Serializable]
public class ItemReferences
{
    public Item item; // 物品引用
    public UnityEvent events; // 物品事件
}

比如我们配置苹果使用可以加人物5饱食度和5水分值

修改Item,绑定对应的事件和使用物品功能

[Header("使用物品")]
public bool removeOneOnUse;// 是否是一次性物品
public UnityEvent myEvent;// 使用物品时触发的事件

private void Start()
{
    // 从物品事件管理器中获取该物品对应的物品事件
    UnityEvent newEvent = ItemEventManager.Instance.GetItemEvents(this);
    if (newEvent != null) myEvent = newEvent;
}

private void OnDisable()
{
    // 如果该物品不在场景中并且其使用物品事件没有任何持续事件,则直接返回
    if (!gameObject.scene.isLoaded || myEvent.GetPersistentEventCount() != 0) return;

    UnityEvent newEvent = ItemEventManager.Instance.GetItemEvents(this);
    if (newEvent != null) myEvent = newEvent;
}

//使用物品
public void UseItem()
{
    if (myEvent.GetPersistentEventCount() > 0)
    {
        myEvent.Invoke();// 触发使用物品事件
        if (removeOneOnUse) currentQuantity--;// 根据设置决定是否减少物品数量
    }
}

解释:

GetPersistentEventCount 是 Unity 中的方法,用于获取 UnityEvent 中持久化(persistent)事件的数量。在这里,它用于检查一个物品的使用事件中是否包含任何持久化的事件。

Unity 的事件系统允许您在编辑器中将方法绑定到事件,这些绑定在运行时会被称为“持久化”事件。GetPersistentEventCount 方法用于获取 UnityEvent 中已经绑定的持久化事件的数量,以便在代码中进行相应的逻辑处理。

在上述代码中,myEvent.GetPersistentEventCount() 用于检查 myEvent 中是否有持久化事件的绑定。如果事件绑定的数量不为 0,则说明该物品的使用事件已经被设置过,因此在禁用时不需要重新获取事件。


勾选苹果为一次性物品,及消耗品

修改Inventory

public void Update()
{
  //...
  
  if (Input.GetMouseButtonDown(0))
  {
      attemptToUseItem();//使用物品
  }
}

//使用物品
private void attemptToUseItem()
{
    if (curHotbarIndex == -1) return;
    Item curItem = hotbarSlots[curHotbarIndex].getItem();// 获取选中的快捷栏中的物品
    if (curItem && curItem.myEvent.GetPersistentEventCount() != 0)
    {
        curItem.UseItem();// 使用物品
        if (curItem.currentQuantity != 0)
            hotbarSlots[curHotbarIndex].updateData();// 更新快捷栏数据
        else
            hotbarSlots[curHotbarIndex].setItem(null);// 如果物品数量为0,清空快捷栏中的物品
        enableHotbarItem(curHotbarIndex);// 再次激活快捷栏中的物品
    }
}

效果

运行看物品事件是否绑定上了

拿在手上点击使用

源码

源码不出意外的话我会放在最后一节

目录
相关文章
|
12月前
|
C# 图形学 开发者
Unity开发中使用UnityWebRequest从HTTP服务器下载资源。
总之,UnityWebRequest就是游戏开发者手中的万能钓鱼竿,既可以获取文本数据,也能钓上图片资源,甚至是那声音的涟漪。使用UnityWebRequest的时候,你需要精心准备,比如确定URL、配置请求类型和头信息;发起请求;巧妙处理钓获的数据;还需要机智面对网络波澜,处理各种可能出现的错误。按照这样的过程,数据的钓取将会是一次既轻松愉快也效率高效的编程钓鱼之旅。
706 18
|
图形学
Unity 获取鼠标位置下的UGUI或3D物体
本文总结了两种检测方法,分别用于UGUI和3D物体的检测。第一种方法`GetOverUIobj`专门用于检测鼠标悬停的UGUI元素,通过`GraphicRaycaster`实现。第二种方法`GetOverWordGameObject`则同时适用于UI和3D物体检测,利用`PhysicsRaycaster`进行射线检测。两者均返回悬停对象或null。
|
前端开发 图形学
unity UGUI跟随3D物体的坐标转换
在 Unity 中实现 UGUI 元素跟随 3D 物体,关键是将 3D 物体的世界坐标转换为屏幕或画布坐标。通过 Camera.WorldToScreenPoint 方法,可将 3D 物体位置映射到屏幕上,再更新 UGUI 元素的位置。代码示例展示了如何使用该方法,使 UGUI 图像跟随 3D 模型,并提供文字显示、图像和线条的显示/隐藏功能。
|
存储 数据挖掘 数据库
服务器数据恢复—EMC UNITY 400存储卷被误删除的数据恢复案例
EMC Unity 400存储连接了2台硬盘柜。2台硬盘柜上一共有21块硬盘(520字节)。21块盘组建了2组RAID6:一组有11块硬盘,一组有10块硬盘。 在存储运行过程中,管理员误操作删除了 2组POOL上的部分数据卷。
|
编译器 vr&ar 图形学
从零开始的unity3d入门教程(五)---- 基于Vuforia的AR项目
这是一篇Unity3D结合Vuforia实现增强现实(AR)项目的入门教程,涵盖了环境配置、Vuforia账户注册、Target数据集创建、Unity项目设置、AR程序配置、Android环境配置以及最终在手机上测试运行的全过程。
从零开始的unity3d入门教程(五)---- 基于Vuforia的AR项目
|
图形学 C#
超实用!深度解析Unity引擎,手把手教你从零开始构建精美的2D平面冒险游戏,涵盖资源导入、角色控制与动画、碰撞检测等核心技巧,打造沉浸式游戏体验完全指南
【8月更文挑战第31天】本文是 Unity 2D 游戏开发的全面指南,手把手教你从零开始构建精美的平面冒险游戏。首先,通过 Unity Hub 创建 2D 项目并导入游戏资源。接着,编写 `PlayerController` 脚本来实现角色移动,并添加动画以增强视觉效果。最后,通过 Collider 2D 组件实现碰撞检测等游戏机制。每一步均展示 Unity 在 2D 游戏开发中的强大功能。
1542 6
|
图形学 开发者 搜索推荐
Unity Asset Store资源大解密:自制与现成素材的优劣对比分析,教你如何巧用海量资产加速游戏开发进度
【8月更文挑战第31天】游戏开发充满挑战,尤其对独立开发者或小团队而言。Unity Asset Store 提供了丰富的资源库,涵盖美术、模板、音频和脚本等,能显著加快开发进度。自制资源虽具个性化,但耗时长且需专业技能;而 Asset Store 的资源经官方审核,质量可靠,可大幅缩短开发周期,使开发者更专注于核心玩法。然而,使用第三方资源需注意版权问题,且可能需调整以适应特定需求。总体而言,合理利用 Asset Store 能显著提升开发效率和项目质量。
667 1
|
API 开发工具 vr&ar
PicoVR Unity SDK⭐️一、SDK下载、项目设置与程序初始配置
PicoVR Unity SDK⭐️一、SDK下载、项目设置与程序初始配置
|
存储 JSON 关系型数据库
【unity实战】制作unity数据保存和加载系统——大型游戏存储的最优解
【unity实战】制作unity数据保存和加载系统——大型游戏存储的最优解
1161 2
|
图形学
【unity实战】Unity中基于瓦片的网格库存系统——类似《逃离塔科夫》的库存系统(下)
【unity实战】Unity中基于瓦片的网格库存系统——类似《逃离塔科夫》的库存系统
874 1

热门文章

最新文章