【制作100个unity游戏之23】实现类似七日杀、森林一样的生存游戏10(附项目源码)

news2024/11/16 14:22:00

本节最终效果演示

在这里插入图片描述

文章目录

  • 本节最终效果演示
  • 系列目录
  • 前言
  • 快捷栏
    • 绘制UI
    • 代码控制快捷列表信息
  • 源码
  • 完结

系列目录

前言

欢迎来到【制作100个Unity游戏】系列!本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第23篇中,我们将探索如何制作一个类似于七日杀和森林的生存游戏。

本篇内容会比较多,我会分几篇来实现,感兴趣的可以关注一下,以免错过内容更新。

本节主要实现了快捷栏的功能。

快捷栏

绘制UI

绘制快捷栏UI,并且重新绘制背包显示的icon,加入背景用于显示选中效果,记得默认隐藏
在这里插入图片描述
记得修改InventorySystem获取图片Icon的方式,以便可以正确显示物品拾取弹窗信息

//添加物品
public void AddToInventory(string itemName)
{
    // 。。。

    TriggerPickupPopUp(itemName, itemToAdd.transform.Find("Icon").GetComponent<Image>().sprite);
}

代码控制快捷列表信息

public class EquipSystem : MonoBehaviour
{
    public static EquipSystem Instance { get; set; }

    public GameObject quickSlotsPanel; // 快捷栏面板
    public List<GameObject> quickSlotsList = new List<GameObject>(); // 快捷栏列表

    private void Awake()
    {
        if (Instance == null)
        {
            Instance = this;
        }
        else
        {
            Destroy(gameObject);
        }
    }

    private void Start()
    {
        PopulateSlotList(); // 填充快捷栏列表
    }

    private void PopulateSlotList()
    {
        foreach (Transform child in quickSlotsPanel.transform)
        {
            if (child.CompareTag("QuickSlot"))
            {
                quickSlotsList.Add(child.gameObject);
            }
        }
    }

    public void AddToQuickSlots(GameObject itemToEquip)
    {
        // 查找下一个可用的快捷栏格子
        GameObject availableSlot = FindNextEmptySlot();
        // 将物品放置在该格子内
        itemToEquip.transform.SetParent(availableSlot.transform, false);
        InventorySystem.Instance.ReCalculeList(); // 重新计算物品列表
        CraftingSystem.Instance.RefreshNeededItems(); // 刷新制作系统所需物品列表
    }

    //获取空闲的格子
    private GameObject FindNextEmptySlot()
    {
        // 遍历快捷栏列表,查找是否有空闲的格子
        foreach (GameObject slot in quickSlotsList)
        {
            if (slot.transform.childCount == 0)
            {
                return slot;
            }
        }
        // 如果没有空闲的格子,则返回一个新的GameObject
        return new GameObject();
    }

    //判断快捷栏是否已满
    public bool CheckIfFull()
    {
        int counter = 0;
        // 遍历快捷栏列表,查找是否有空闲的格子
        foreach (GameObject slot in quickSlotsList)
        {
            if (slot.transform.childCount > 0)
            {
                counter ++;

            }
        }
        // 如果遍历完所有格子,都没有空闲的格子,则表示快捷栏已满
        if (counter == 7)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}

挂载代码,配置信息
在这里插入图片描述
修改InventoryItem,实现特定物品才可以拉到快捷栏

[Header("是否已经装备")]
public bool isNowEquipped;

// 当鼠标点击物品时触发
public void OnPointerDown(PointerEventData eventData)
{
	// 。。。
	
    //按左shift再点击鼠标左键装备/卸载物品
   	if (Input.GetKey(KeyCode.LeftShift) && eventData.button == PointerEventData.InputButton.Left)
    {
        // 该物品可装备尚未装备,并且装备栏未满
        if (isNowEquipped == false && EquipSystem.Instance.CheckIfFull() == false)
        // if (isEquippable && isNowEquipped == false && EquipSystem.Instance.CheckIfFull() == false)
        {
            // 将物品添加到快捷栏并标记为已装备
            EquipSystem.Instance.AddToQuickSlots(gameObject);
            isNowEquipped = true;
            
        }
        // 该物品可装备已经装备,并且背包未满
        else if (isNowEquipped == true && InventorySystem.Instance.CheckIfFull() == false)
        {
            // 将物品添加到背包并标记为未装备
            InventorySystem.Instance.AddToInventory(gameObject);
            isNowEquipped = false;
        }
    }
}

修改InventorySystem,添加新的新增物品方法

//添加物品
public void AddToInventory(GameObject itemToAdd)
{
    // 找到下一个空闲的槽位
    whatSlotToEquip = FindNextEmptySlot();
    // 将新实例化的物体的父对象设置为whatSlotToEquip
    itemToAdd.transform.SetParent(whatSlotToEquip.transform, false);

    // 将物品名称添加到itemList中
    itemList.Add(itemToAdd.GetComponent<InventoryItem>().thisName);

    ReCalculeList();
    CraftingSystem.Instance.RefreshNeededItems();
}

修改ItemSlot,判断放置时是否是快捷栏,修改装备状态

// 当拖拽物体被放置到当前物品槽时
public void OnDrop(PointerEventData eventData)
{
	if (!Item)
   	{
	    // 。。。
	
	    // 如果当前物品槽不是快捷栏
	    if (transform.CompareTag("QuickSlot") == false)
	    {
	        // 标记待装备的物品为未装备状态
	        DragDrop.itemBeingDragged.GetComponent<InventoryItem>().isNowEquipped = false;
	        InventorySystem.Instance.ReCalculeList(); // 重新计算物品列表
            CraftingSystem.Instance.RefreshNeededItems(); // 刷新制作系统所需物品列表
	    } else {
	      	// 标记待装备的物品为装备状态
	        DragDrop.itemBeingDragged.GetComponent<InventoryItem>().isNowEquipped = true;
	        InventorySystem.Instance.ReCalculeList(); // 重新计算物品列表
            CraftingSystem.Instance.RefreshNeededItems(); // 刷新制作系统所需物品列表
	    }
	 }
}

效果
在这里插入图片描述

源码

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

完结

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,以便我第一时间收到反馈,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!

好了,我是向宇,https://xiangyu.blog.csdn.net

一位在小公司默默奋斗的开发者,出于兴趣爱好,最近开始自学unity,闲暇之余,边学习边记录分享,站在巨人的肩膀上,通过学习前辈们的经验总是会给我很多帮助和启发!php是工作,unity是生活!如果你遇到任何问题,也欢迎你评论私信找我, 虽然有些问题我也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1443958.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言-----自定义类型-----结构体枚举联合

结构体和数组一样&#xff0c;都是一群数据的集合&#xff0c;不同的是数组当中的数据是相同的类型&#xff0c;但是结构体中的数据类型可以不相同&#xff0c;结构体里的成员叫做成员变量 结构体类型是C语言里面的一种自定义类型&#xff0c;我们前面已经了解到过int,char,fl…

2024 年 5 款适用于免费 iPhone 数据恢复的工具软件

搜索一下&#xff0c;你会发现许多付费或免费的iPhone数据恢复工具声称它们可以帮助你以很高的成功率找回所有丢失的数据。然而&#xff0c;这正是问题所在。真的很难做出选择。为了进一步帮助您解决数据丢失问题&#xff0c;我们在此列出了 5 款最好的免费 iPhone 恢复软件供您…

计算机网络——07协议层次及服务模型

协议层次及服务模型 协议层次 网络是一个复杂的系统 网络功能复杂&#xff1a;数字信号的物理信号承载、点到点、路由、rdt、进程区分、应用等现实来看&#xff0c;网络的许多构成元素和设备&#xff1a; 主机路由器各种媒体的链路应用协议硬件&#xff0c;软件 问题是&am…

C++ 贪心 区间问题 区间分组

给定 N 个闭区间 [ai,bi] &#xff0c;请你将这些区间分成若干组&#xff0c;使得每组内部的区间两两之间&#xff08;包括端点&#xff09;没有交集&#xff0c;并使得组数尽可能小。 输出最小组数。 输入格式 第一行包含整数 N &#xff0c;表示区间数。 接下来 N 行&…

蓝桥杯每日一题------背包问题(三)

前言 之前求的是在特点情况下选择一些物品让其价值最大&#xff0c;这里求的是方案数以及具体的方案。 背包问题求方案数 既然要求方案数&#xff0c;那么就需要一个新的数组来记录方案数。动态规划步骤如下&#xff0c; 定义dp数组 第一步&#xff1a;缩小规模。考虑n个物品…

CSP-202009-2-风险人群筛查

CSP-202009-2-风险人群筛查 解题思路 检查是否经过高危区 (x > x1) && (x < x2) && (y > y1) && (y < y2) 检查坐标是否在高危区域内&#xff0c; !isPassed 确保仅在第一次经过高危区域时增加 pass 计数。如果条件成立&#xff0c;表示…

Python3集合 set 心得

Python3集合 set 心得 本文是个人在学习中的一些心得&#xff0c;不能保证文中的内容准确&#xff0c;欢迎大家批评指正。 集合 set 是Python中的一种数据容器&#xff0c;集合有2种定义方式。 1、花括号 {} &#xff0c;花括号内加入集合的元素&#xff0c;元素之间用逗号 …

spark sql上线前的调试工作实现

背景 每个公司应该都有大数据的平台的吧&#xff0c;平台的作用就是可以在上面执行各种spark sql以及定时任务&#xff0c;不过一般来说&#xff0c;由于这些spark sql的上线不经过测试&#xff0c;所以可能会影响到生产的数据&#xff0c;这种情况下大数据平台提供一个上线前…

网络扫描神器:Nmap 保姆级教程(附链接)

一、介绍 Nmap&#xff08;Network Mapper&#xff09;是一款用于网络发现和安全审计的开源工具。它最初由 Gordon Lyon&#xff08;也被称为 Fyodor Vaskovich&#xff09;开发&#xff0c;是一款功能强大且广泛使用的网络扫描工具。Nmap 允许用户在网络上执行主机发现、端口…

【十四】【C++】list 的常见用法

list 的初始化和遍历 /*list的初始化和遍历*/ #if 1 #include <list> #include <vector> #include <iostream> #include<algorithm> using namespace std;void TestList1(){list<int> L1;list<int> L2(10, 5);vector<int> v{1,2,3,4…

奇异值分解(SVD)的应用——图像压缩

SVD方法是模型降阶的一类重要方法&#xff0c;本征正交分解&#xff08;POD&#xff09;和平衡截断&#xff08;BT&#xff09;都属于SVD类方法。 要想深入了解模型降阶技术&#xff0c;我们可以先从SVD的应用入手&#xff0c;做一个直观的了解。 1. SVD的定义和分类 我们想寻找…

01-Spring实现重试和降级机制

主要用于在模块调用中&#xff0c;出现失败、异常情况下&#xff0c;仍需要进行重复调用。并且在最终调用失败时&#xff0c;可以采用降级措施&#xff0c;返回一般结果。 1、重试机制 我们采用spring 提供的retry 插件&#xff0c;其原理采用aop机制&#xff0c;所以需要额外…

无人机应用场景和发展趋势,无人机技术的未来发展趋势分析

随着科技的不断发展&#xff0c;无人机技术也逐渐走进了人们的生活和工作中。无人机被广泛应用于很多领域&#xff0c;例如遥感、民用、军事等等。本文将围绕无人机技术的应用场景和发展趋势&#xff0c;从多角度展开分析。 无人机技术的应用场景 无人机在遥感方面的应用&…

2024 年,如何用 6 个月拿下 30 万年薪的区块链开发?

《区块链简易速速上手小册》开源系列专栏 文章目录 一、了解区块链二、简易速速上手小册系列&#xff08;开源版&#xff09;三、具体安排参考第1个月&#xff1a;基础加固第2个月&#xff1a;区块链原理与技术第3个月&#xff1a;深入智能合约开发第4个月&#xff1a;区块链平…

vtkActor 设置特定图层 显示及置顶显示

问题&#xff0c;有时我们需要显示某个 Actor 在相机最前面&#xff0c;可以遮盖后面的物体;显示在顶层有点不准确&#xff1b;因为这个还相机位置也有关系&#xff1b; 这里讲三种情况&#xff1a; 1. 设置 Mapper 顶层&#xff0c;尝试了一下&#xff0c;可以用于某些场景&…

C++ 模板初阶【函数模板,类模板】

文章目录 泛型编程函数模板概念函数模板的格式函数模板的原理函数模板的实例化隐式实例化:让编译器根据实参推演模板参数的实际类型显式实例化&#xff1a;在函数名后的<>中指定模板参数的实际类型 函数模板的匹配规则 类模板概念类模板格式类模板的实例化 泛型编程 在我…

【计算几何】确定两条连续线段向左转还是向右转

确定两条连续线段向左转还是向右转 目录 一、说明二、算法2.1 两点的叉积2.2 两个段的叉积 三、旋转方向判别3.1 左转3.2、右转3.3 共线判别 一、说明 如果是作图&#xff0c;或者是判别小车轨迹。为了直观地了解&#xff0c;从当前点到下一个点过程中&#xff0c;什么是左转、…

2-1 动手学深度学习v2-Softmax回归-笔记

回归 VS 分类 回归估计一个连续值分类预测一个离散类别 从回归到多类分类 回归 单连续数值输出输出的区间&#xff1a;自然区间 R \mathbb{R} R损失&#xff1a;跟真实值的区别 分类 通常多个输出&#xff08;这个输出的个数是等于类别的个数&#xff09;输出的第 i i i…

Redis核心技术与实战【学习笔记】 - 27.限制Redis Cluster规模的因素(通信开销)

简述 Redis Cluster 能保存的数据量以及支撑的吞吐量&#xff0c;跟集群实例规模相关。 Redis 官方给出了 Redis Cluster 的规模上线&#xff0c;就是一个集群运行 1000 个实例。 其实&#xff0c;限定 Redis Cluster 集群规模的一个关键因素就是&#xff0c;实例间的通信开销…

MySQL优化器

优化器 MySQL存储引擎中存在了一个可插拔的优化器OPTIMIZER_TRACE&#xff0c;可以看到内部查询计划的TRACE信息&#xff0c;从而可以知道MySQL内部执行过程 查询优化器状态 show variables like optimizer_trace;Variable_name Valueoptimizer_trace enabledoff,one_lineoff…