U3D游戏开发之商店系统(UGUI版)

很久没有打新的代码了,国庆节闲的无聊,突然想起来一年前似乎画过一个饼(在商店系统NGUI版里面画的),说是日后会持续更新UGUI版本 的商店系统的制作,今天请大家来吃饼。(免费吃饼,大家放心吃!)

首先,制作一款商店系统,都是根据策划的策划案需求来制作的。我们先接到了策划案。具体大致是:界面右上角有一个商店的功能按钮,点开就会出现商店面板,面板上面有一个可以隐藏面板的按钮,面板鼠标可以拖动查看商品,商品条包含商品图像,商品价格和商品购买按钮这三部分组成。其中购买成功或者购买失败都会有小黑款提示字符出现提醒玩家,购买成功就扣除金币,并且自动放入玩家背包。如果玩家背包已满就自动触发替换面板让玩家选择替换一个物品。

明确需求之后,我们首先大致拼凑一下UI面板的大致模样。(UI拼接省略)

对于每一个商品,我们只需要拼接好其中一个小组件即可(可复用)

我们现在对其中一个小组件编写代码逻辑:

using NicoleFrameWork;
using UnityEngine;
using UnityEngine.U2D;
using UnityEngine.UI;public class ShopItem : BasePanel
{private ShopInfo _shopInfo;/// <summary>/// 初始化/// </summary>public void Init(ShopInfo shopInfo){_shopInfo = shopInfo;ChangeType();//还有图像没有处理 等待美术资源GetControl<Text>("txtMoney").text = $"${shopInfo.Money}";GetControl<Text>("txtName").text = _shopInfo.Name;GetControl<Button>("BtnBuy").onClick.AddListener(() =>{//如果是金币不足就显示货币不足if(MyCardGameMgr.Instance.PlayerMoney<_shopInfo.Money)UIMgr.Instance.GetPanel<ShopPanel>((panel) =>{panel.ChangeBuyTip("金币不足");});//如果货币充足就显示购买成功else{MyCardGameMgr.Instance.PlayerMoney -= _shopInfo.Money;UIMgr.Instance.GetPanel<GamePanel>((panel) =>{panel.ChangeMoney();});UIMgr.Instance.GetPanel<ShopPanel>((panel) =>{panel.ChangeBuyTip("购买成功");});ChangeType();//如果没有if (Bag.Instance.num < MyCardGameMgr.MaxGrids){for (int i=0;i<MyCardGameMgr.MaxGrids;i++){if (!Bag.Instance.GridItems[i].IsHasInfo){Bag.Instance.GridItems[i].Init(_shopInfo.ItemID);break;}}}//如果上限 就替换else{UIMgr.Instance.ShowPanel<TiHuanPanel>(E_LoadingMethod.Res,E_UI_Layer.Top,false, (panel) =>{panel.itemInfos = BinaryMgr.Instance.GetTable<ItemInfoContainer>().DataDic[_shopInfo.ItemID];panel.eChooseTypes = E_ChooseType.Null;});}}});string[] str;str = TextUtil.SplitStr(_shopInfo.Icon, E_SplitType.Underline);GetControl<Image>("ShopIcon").sprite=ResMgr.Instance.Load<SpriteAtlas>(str[0]).GetSprite(str[1]);str = null;}/// <summary>/// 改变玩家的购买状态(根据玩家金币数量)/// </summary>public void ChangeType(){if (MyCardGameMgr.Instance.PlayerMoney < _shopInfo.Money)GetControl<Button>("BtnBuy").image.color = Color.gray;elseGetControl<Button>("BtnBuy").image.color = Color.white;}public override void ShowMe(){}public override void HideMe(){}
}

其中,对于购买按钮以及购买是否成功制作了一些相关逻辑,对于背包已满的情况做出了逻辑处理。(对于每个小组件都做出了初始化的操作)初始化采用二进制数据读取excel列表的方式。(其中如果玩家金币不足就将购买按钮置灰,我是直接调用函数使用的,当然可以直接用事件中心自动分发事件)

一个小组件就做好了,想要完成一整个商店就需要很多小组件,那么我们制作商店面板逻辑,使之加载小组件,并且将其他依次初始化达到不同的效果:

using NicoleFrameWork;
using UnityEngine;
using UnityEngine.UI;public class ShopPanel : BasePanel
{// Start is called before the first frame updatevoid Start(){GetControl<Button>("BtnClose").onClick.AddListener(() =>{UIMgr.Instance.HidePanel<ShopPanel>(true);});Init();}/// <summary>/// 初始化/// </summary>public void Init(){//隐藏提示内容GetControl<Image>("ShopTip").gameObject.SetActive(false);for (int i = 0; i < MyCardGameMgr.Instance.ShopInfoContainers.DataDic.Count; i++){GameObject obj=PoolMgr.Instance.GetPoolObj("UI/ShopItem");obj.transform.position = new Vector3(11.6f,  i * (-120), 0);obj.transform.SetParent(GetControl<ScrollRect>("ShopScr").content,false);obj.GetComponent<ShopItem>().Init(MyCardGameMgr.Instance.ShopInfoContainers.DataDic[i+1]);}GetControl<ScrollRect>("ShopScr").content.sizeDelta =new Vector2(0, 120 * MyCardGameMgr.Instance.ShopInfoContainers.DataDic.Count);}/// <summary>/// 更改购买提示内容/// </summary>public void ChangeBuyTip(string txtTip){GetControl<Text>("txtTip").text = txtTip;GetControl<Image>("ShopTip").gameObject.SetActive(true);Invoke("HideTip",0.8f);}private void HideTip()=>GetControl<Image>("ShopTip").gameObject.SetActive(false);public override void ShowMe(){}public override void HideMe(){}
}

此处使用resources加载了小组件,然后对组件进行初始化并且代码将其顺序排列,还制作了购买成功与否的提示条逻辑,相对来讲代码比较简单。

以上就是使用UGUI代码制作的商店小系统,主要是大致的代码思路,针对于有一定开发基础,可以摸鱼借鉴,喜欢就请点赞收藏吧。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【python】追加写入excel

输出文件运行前&#xff08;有两张表&#xff0c;“表1”和“Sheet1”&#xff09;&#xff1a; 目录 一&#xff1a;写入单表&#xff08;删除所有旧工作表&#xff0c;写入新表&#xff09;二&#xff1a;写入多表&#xff08;删除所有旧工作表&#xff0c;写入新表&#x…

docker环境下配置cerbot获取免费ssl证书并自动续期

文章目录 实践场景了解certbot查看nginx的映射情况操作目标配置nginx配置的ssl证书设置自动续签 实践场景 本人使用docker部署了一个nginx容器&#xff0c;通过容器卷&#xff0c;实现本地html&#xff0c;ssl&#xff0c;conf和ngiinx容器映射的&#xff0c; 经常需要手动部署…

【GEE学习第三期】GEE常用函数总结

【GEE学习第三期】GEE常用函数总结 数据统计类ee.List.sequence函数 图像处理类ee.Geometry类‌defaultVisualizationVis函数 数据输入输出数值与绘图导出影像 参考 数据统计类 ee.List.sequence函数 用法如下&#xff1a; ee.List.sequence &#xff08;开始&#xff0c;结…

【Spring】@RequestMapping、@RestController和Postman

文章目录 1.RequestMapping 注解介绍2. RequestMapping 使用3. RequestMapping 是 GET 还是 POST 请求&#xff1f;GET 请求POST 请求指定 GET/POST 方法类型 2. Postman 介绍1. 创建请求2. 传参介绍1. 普通传参2. form-data3. x-www-form-urlencoded form 表单&#xff0c;对应…

PWM 模式

一、介绍 PWM&#xff08;脉宽调制&#xff0c;Pulse-width modulation&#xff09;是一种通过调节脉冲信号的宽度来控制电能输出的方法。PWM是一种方波信号&#xff0c;通常在电子和电气工程中用于调节功率输送&#xff0c;控制电机速度&#xff0c;调节LED亮度&#xff0c;以…

【CSS Tricks】css动画详解

目录 引言一、动画关键帧序列二、动画各属性拆解1. animation-name2. animation-duration3. animation-delay3.1 设置delay为正值3.2 设置delay为负值 4. animation-direction5. animation-iteration-count6. animation-fill-mode7. animation-play-state8. animation-timing-f…

MySQL的驱动安装

1、下载并安装MySQL 下载地址&#xff1a; 建议在下列框中选择LTS长期支持版本&#xff0c;下载对应的MSI安装文件。 安装完成后&#xff0c;将MySQL的环境bin路径添加到环境变量中。 可以运行MySQL Configurator进行配置&#xff0c;主要设置密码&#xff0c;并初始化。其余…

网络基础 【HTTP】

&#x1f493;博主CSDN主页:麻辣韭菜&#x1f493;   ⏩专栏分类&#xff1a;Linux初窥门径⏪   &#x1f69a;代码仓库:Linux代码练习&#x1f69a; &#x1f4bb;操作环境&#xff1a; CentOS 7.6 华为云远程服务器 &#x1f339;关注我&#x1faf5;带你学习更多Linux知识…

JVM Class类文件结构

国庆节快乐 2024年10月2日17:49:22 目录 前言 magic 数 文件版本 使用JClassLib观察class文件 一般信息 接口 常量池 字段 方法 常量池计数器 常量池 类型 CONSTANT_Methodref_info CONSTANT_Class_info 类型结构总表 访问标志 类索引, …

通信协议感悟

本文结合个人所学&#xff0c;简要讲述SPI&#xff0c;I2C&#xff0c;UART通信的特点&#xff0c;限制。 1.同步通信 UART&#xff0c;SPI&#xff0c;I2C三种串行通讯方式&#xff0c;SPI功能引脚为CS&#xff0c;CLK&#xff0c;MOSI&#xff0c;MISO&#xff1b;I2C功能引…

【api连接ChatGPT的最简单方式】

通过api连接ChatGPT的最简单方式 建立client 其中base_url为代理&#xff0c;若连接官网可省略&#xff1b;配置环境变量 from openai import OpenAI client OpenAI(base_url"https://api.chatanywhere.tech/v1" )或给出api和base_url client OpenAI(api_key&…

冯诺依曼体系结构与操作系统简介

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 冯诺依曼体系结构与操作系统简介 收录于专栏[Linux学习] 本专栏旨在分享学习Linux的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 1.…

使用TensorBoard可视化模型

目录 TensorBoard简介 神经网络模型 可视化 轮次-损失曲线 轮次-准确率曲线 轮次-学习率曲线 迭代-评估准确率曲线 迭代-评估损失曲线 TensorBoard简介 TensorBoard是一款出色的交互式的模型可视化工具。安装TensorFlow时,会自动安装TensorBoard。如图: TensorFlow可…

vscode 连接云服务器(ubantu 20.04)

更改服务器系统 如果云服务器上的系统不是ubantu20.04的&#xff0c;可以进行更改&#xff1a; 登录云服务官网&#xff08;这里以阿里云为例&#xff09;点击控制台 点击服务器实例 点击更多操作、重置系统 点击重置为其他镜像、系统镜像&#xff1a;选择你要使用的系统镜像…

解决MySQL报Incorrect datetime value错误

目录 一、前言二、问题分析三、解决方法 一、前言 欢迎大家来到权权的博客~欢迎大家对我的博客进行指导&#xff0c;有什么不对的地方&#xff0c;我会及时改进哦~ 博客主页链接点这里–>&#xff1a;权权的博客主页链接 二、问题分析 这个错误通常出现在尝试将一个不…

随笔(四)——代码优化

文章目录 前言1.原本代码2.新增逻辑3.优化逻辑 前言 原逻辑&#xff1a;后端data数据中返回数组&#xff0c;数组中有两个对象&#xff0c;一个是属性指标&#xff0c;一个是应用指标&#xff0c;根据这两个指标展示不同的多选框 1.原本代码 getIndicatorRange(indexReportLi…

企业级版本管理工具(1)----Git

目录 1.Git是什么 2.Git的安装和使用 在Ubuntu下安装命令如下&#xff1a; 使用git --version查看已安装git的版本&#xff1a; 使用git init初始化仓库&#xff1a; 使用tree .git列出目录&#xff1a; 使用git config命令设置姓名和邮箱&#xff1a; 加入--global选项…

【前端】前端数据转化为后端数据

【前端】前端数据转化为后端数据 写在最前面格式化数组代码解释hasOwnProperty是什么&#xff1f; &#x1f308;你好呀&#xff01;我是 是Yu欸 &#x1f30c; 2024每日百字篆刻时光&#xff0c;感谢你的陪伴与支持 ~ &#x1f680; 欢迎一起踏上探险之旅&#xff0c;挖掘无限…

【操作系统】引导(Boot)电脑的奇妙开机过程

&#x1f339;&#x1f60a;&#x1f339;博客主页&#xff1a;【Hello_shuoCSDN博客】 ✨操作系统详见 【操作系统专项】 ✨C语言知识详见&#xff1a;【C语言专项】 目录 什么是操作系统的引导&#xff1f; 操作系统的引导&#xff08;开机过程&#xff09; Windows操作系…

渗透测试入门学习——使用python脚本自动识别图片验证码,OCR技术初体验

写在前面 由于验证码在服务端生成后存储在服务器的session中&#xff0c;而标用于标识用户身份的sessionid存在于用户cookie中 所以本次识别验证码时需要用requests.session()创建会话对象&#xff0c;模拟真实的浏览器行为&#xff0c;保持与服务器的会话才能获取登录时服务…