当前位置: 首页 > article >正文

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

本节最终效果演示

在这里插入图片描述

文章目录

  • 本节最终效果演示
  • 系列目录
  • 前言
  • 制作木板
    • UI直接复制和工具一样的即可
    • 检查背包是否有指定数量的空插槽
  • 源码
  • 完结

系列目录

前言

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

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

本节主要实现新的制作功能。

制作木板

UI直接复制和工具一样的即可

在这里插入图片描述

检查背包是否有指定数量的空插槽

修改InventorySystem的CheckIfFull方法,改名为CheckSlotsAvailable,因为我们需要判断背包是否有指定数量的空位

//判断背包是否有指定数量的空位
public bool CheckSlotsAvailable(int emptyMeeded)
{
    int emptySlot = 0;
    // 遍历slotList列表中的每个槽位对象
    foreach (GameObject slot in slotList)
    {
        // 如果槽位对象没有子对象,及是空位
        if (slot.transform.childCount <= 0)
        {
            emptySlot += 1;
        }
    }

    // 如果空位大于等于emptyMeeded,返回true,否则返回false
    if (emptySlot >= emptyMeeded)
    {
        return true;
    }
    else
    {
        return false;
    }
}

记得同步修改其他调用该方法的地方,比如
在这里插入图片描述

修改Blueprint蓝图,添加制作数量

public int numOfItrmsToProduce; // 生成的数量

public Blueprint(string name, int producedItems, int reqNUM, string R1, int R1num, string R2, int R2num)
{
    numOfItrmsToProduce = producedItems;
    //。。。
}

修改CraftingSystem

[Header("材料")]
public GameObject materialsScreenUl;
Button materialsBTN;
Button craftPlankBTN;// 制作木板按钮
TextMeshProUGUI LogReq1;// 需求材料文本
public Blueprint PlankBLP = new Blueprint("木板", 2, 1, "圆木", 1, "", 0); //木板制作蓝图

void Start()
{
    //。。。

    /// <summary>
    /// 材料
    /// </summary>
    materialsBTN = craftingScreenUl.transform.Find("背景").Find("材料").GetComponent<Button>();
    materialsBTN.onClick.AddListener(delegate { OpenMaterialsCategory(); });
    // 木板
    LogReq1 = materialsScreenUl.transform.Find("背景").Find("内容").Find("木板").Find("材料1").GetComponent<TextMeshProUGUI>();
    craftPlankBTN = materialsScreenUl.transform.Find("背景").Find("内容").Find("木板").Find("制作按钮").GetComponent<Button>();
    craftPlankBTN.onClick.AddListener(delegate { CraftAnyltem(PlankBLP); });

    RefreshNeededItems();
}

//制作事件
void CraftAnyltem(Blueprint blueprintToCraft)
{
    //判断背包是否够位置
    if(!InventorySystem.Instance.CheckSlotsAvailable(blueprintToCraft.numOfItrmsToProduce)){
        //TODO报错提示,错误提示音
        Debug.Log("库存不足");
        return;
    }

    AudioManager.Instance.PlaySFX("制作");
    for (int i = 0; i < blueprintToCraft.numOfItrmsToProduce; i++)
    {
        InventorySystem.Instance.AddToInventory(blueprintToCraft.itemName);
    }

    //按需求的总数,删除对应的物品
    if (blueprintToCraft.numOfRequirements == 1)
    {
        InventorySystem.Instance.RemoveItem(blueprintToCraft.Req1, blueprintToCraft.Req1amount);
    }
    else if (blueprintToCraft.numOfRequirements == 2)
    {
        InventorySystem.Instance.RemoveItem(blueprintToCraft.Req1, blueprintToCraft.Req1amount);
        InventorySystem.Instance.RemoveItem(blueprintToCraft.Req2, blueprintToCraft.Req2amount);
    }
}

//刷新需要的物品
public void RefreshNeededItems()
{
    int stone_count = 0; // 石头数量
    int stick_count = 0; // 树枝数量
    int log_count = 0; // 圆木数量

    inventoryltemList = InventorySystem.Instance.itemList; // 获取物品清单

    foreach (string itemName in inventoryltemList) // 遍历物品清单
    {
        switch (itemName)
        {
            case "小石头":
                stone_count += 1;
                break;
            case "树枝":
                stick_count += 1;
                break;
            case "圆木":
                log_count += 1;
                break;
        }
    }

    // 更新需求文本
    AxeReq1.text = "2 石头 [" + stone_count + "]"; // 显示需要的石头数量
    AxeReq2.text = "2 树枝 [" + stick_count + "]"; // 显示需要的树枝数量

    LogReq1.text = "1 圆木 [" + log_count + "]";

    //斧头制作按钮
    if (stone_count >= 2 && stick_count >= 2)
    {
        craftAxeBTN.gameObject.SetActive(true);
    }
    else
    {
        craftAxeBTN.gameObject.SetActive(false);
    }

    //木板制作按钮
    if (log_count >= 1)
    {
        craftPlankBTN.gameObject.SetActive(true);
    }
    else
    {
        craftPlankBTN.gameObject.SetActive(false);
    }
}

void OpenToolsCategory()
{
    craftingScreenUl.SetActive(false); // 关闭制作界面
    toolsScreenUl.SetActive(true); // 打开工具界面   
    materialsScreenUl.SetActive(false); // 关闭材料界面   
}

void OpenMaterialsCategory()
{
    craftingScreenUl.SetActive(false);
    toolsScreenUl.SetActive(false);
    materialsScreenUl.SetActive(true);
}

void Update()
{
    if (Input.GetKeyDown(KeyCode.I))
    {
        // 打开关闭制作界面
        craftingScreenUl.SetActive(!isOpen);

        if (isOpen)
        {
            toolsScreenUl.SetActive(false); // 关闭工具界面
            materialsScreenUl.SetActive(false); // 关闭材料界面
        }

        isOpen = !isOpen;

        // 设置鼠标锁定模式为无锁定,允许鼠标在界面上移动
        Cursor.lockState = (isOpen || InventorySystem.Instance.isOpen) ? CursorLockMode.None : CursorLockMode.Locked;
    }
}

配置参数
在这里插入图片描述
效果
在这里插入图片描述

源码

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

完结

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

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

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

在这里插入图片描述


http://www.kler.cn/a/234156.html

相关文章:

  • 动态规划问题-删除并获得点数(Java实现)
  • SQL集合运算
  • 如何使用 Web Scraper API 高效采集 Facebook 用户帖子信息
  • StructuredStreaming (一)
  • Go语言 实现将中文转化为拼音
  • 微服务各组件整合
  • 如何解决利用cron定时任务自动更新SSL证书后Nginx重启问题
  • 如何从 iPhone 恢复已删除的视频:简单有效方法
  • 【漏洞复现】多语言药房管理系统MPMS文件上传漏洞
  • [论文总结] 深度学习在农业领域应用论文笔记12
  • LayUI中表格树折叠 --
  • Redis -- 安装客户端redis-plus-plus
  • 形态学算法之边界提取的简单python实现——图像处理
  • C# Socket通信从入门到精通(21)——Tcp客户端判断与服务器断开连接的三种方法以及C#代码实现
  • 1.5 Binance_interface API 币本位合约行情
  • Java基础知识总结(持续更新中)
  • 第一篇【传奇开心果微博文系列】Python微项目技术点案例示例:pillow库实现毛笔字春联
  • 华为数通方向HCIP-DataCom H12-821题库(单选题:461-480)
  • 【RabbitMQ(二)】:Exchange 详解 | Message Convert 消息转换器
  • (注解配置AOP)学习Spring的第十七天
  • 每日五道java面试题之java基础篇(五)
  • 43.1k star, 免费开源的 markdown 编辑器
  • grafana+prometheus+hiveserver2(jmx_exporter+metrics)
  • [AIGC] Spring Gateway:一个简单 yet powerful API 网关
  • 每日五道java面试题之java基础篇(二)
  • Go内存优化与垃圾收集