U3D游戏开发之中制作有选项的提示面板

news2024/10/6 3:38:44

在游戏开发之中,我们会遇到一些提示面板存在多个选项供玩家选择,比如是否确定购买该物品,一个是一个否。或者是是否选择存档一,一个选择,一个放弃存档。这种提示框在游戏之中非常常见,然而,我们不可能为此制作多个UI,那么如何通过一个UI以及部分提示内容的框架代码达到以上的效果呢?

我们获取到这类需求,开始大致思考思路:首先,两个按钮造成的事件是不同的,不同的提示框选择的内容也是不同的,那么我们可以将他们制作成委托事件,使用回调的方式让他们每次创建都可以保证逻辑根据具体的事件内容发生变化。至于按钮的文字显示以及窗口的文字显示就另外制作逻辑让他们发生改变。这些逻辑我们可以将他们制作到同一个方法体之中。捋清楚思路之后,我们开始写代码:

using UnityEngine.Events;
using UnityEngine.UI;

public class TipPanel : TipPanelBase
{
    /// <summary>
    /// 左右两边按钮按下之后调用的函数内容
    /// </summary>
    private UnityAction _callBack1;
    private UnityAction _callBack2;
    public override void Start()
    {
        base.Start();
        
    }

    public override void HideMe()
    {
        base.HideMe();
        
    }

    public override void ShowMe()
    {
        base.ShowMe();
        
    }

    protected override void BtnYesClick()
    {
        base.BtnYesClick();
        _callBack1?.Invoke();
    }

    protected override void BtnNoClick()
    {
        base.BtnNoClick();
        _callBack2?.Invoke();
    }

    /// <summary>
    /// 初始化提示页面的方法
    /// </summary>
    /// <param name="txt">文本信息</param>
    /// <param name="txtB1">按钮1显示内容</param>
    /// <param name="txtB2">按钮2显示内容</param>
    public void Init(string txt,string txtB1="是",string txtB2="再想想")
    {
        GetControl<Text>("txtTip").text = txt;
        GetControl<Text>("txt1").text = txtB1;
        GetControl<Text>("txt2").text = txtB2;
    }
    /// <summary>
    /// 用于设置按钮点击事件的回调函数
    /// </summary>
    /// <param name="callBackLeft"></param>
    /// <param name="callBackRight"></param>
    public void SetEvent(UnityAction callBackLeft, UnityAction callBackRight)
    {
        _callBack1 = callBackLeft;
        _callBack2 = callBackRight;
    }

}

我们首先根据之前的思路,制作出面板逻辑,随后由于该逻辑可能在整个游戏之中能够使用,所以我们创建一个MyGameMgr的单例模式管理器,使其贯穿整个游戏,在该管理器之中添加以下调用逻辑的方法:

    /// <summary>
    /// 用于改变提示内容的方法
    /// </summary>
    /// <param name="txTTip">提示文字内容</param>
    /// <param name="callBackLeft">左边按钮触发的回调函数</param>
    /// <param name="callBackRight">右边按钮触发的回调函数</param>
    /// <param name="txtB1">左边按钮的文本显示内容</param>
    /// <param name="txtB2">右边按钮显示的文本显示内容</param>
    public void ChangeTipPanelTip(string txTTip, UnityAction callBackLeft, UnityAction callBackRight,
        string txtB1 = "是", string txtB2 = "再想想")
    {
        UIMgr.Instance.ShowPanel<TipPanel>(E_LoadingMethod.Res,E_UI_Layer.System,false, (panel) =>
        {
            panel.Init(txTTip,txtB1,txtB2);
            panel.SetEvent(callBackLeft,callBackRight);
        });
    }

这样看来就可以完成之前我们的猜测了,那么我们开始使用这一小段逻辑:

在此之前我接到了一个关于提示面板的需求:进入游戏之后选择职业,选择职业之后点击确定开始弹窗是否选择XX职业,左键是,右键再想想,如果点击左键就创建对应的职业玩家,并且初始化内容,同时关闭职业选择的页面,游戏进入第一回合。如果点击右键玩家就重新选择职业。得到这样的需求之后,我们根据之前做好的提示小框架开始使用我们的代码:

 MyCardGameMgr.Instance.ChangeTipPanelTip($"确定以{MyCardGameMgr.Instance.Careers.Name}职业进行游戏吗?", () =>
        {
            MyCardGameMgr.Instance.HeroTarge = ResMgr.Instance.Load<GameObject>(MyCardGameMgr.Instance.Careers.HeroRes).transform;
            GameObject.Find("Main Camera").GetComponent<CameraMove>().target = MyCardGameMgr.Instance.HeroTarge;
            //更新玩家信息
            MyCardGameMgr.Instance.HeroTarge.gameObject.GetComponent<PlayerMoveC>().InitInfo();
            MapMgr.Instance.PlayerMoveCs = MyCardGameMgr.Instance.HeroTarge.gameObject.GetComponent<PlayerMoveC>();
            UIMgr.Instance.HidePanel<CareerChoicesPanel>(true);
            UIMgr.Instance.ShowPanel<ChoosePanel>(E_LoadingMethod.Res,E_UI_Layer.Top);
            UIMgr.Instance.ShowPanel<GamePanel>();
            UIMgr.Instance.HidePanel<TipPanel>(true);
        }, () =>
        {
            UIMgr.Instance.HidePanel<TipPanel>(true);
        });

(以上的数据使用了二进制进行读取)

如果是存档,面板内容不同,我们也可以完美实现事件替换:

核心代码如下:

 /// <summary>
    /// 用于保护存档的机制
    /// </summary>
    private void SaveProtect(int num)
    {
        if(MyCardGameMgr.Instance.PlayerSavesList.Count<num-1)
            MyCardGameMgr.Instance.ChangeTipPanelTip($"当前的存档{MyCardGameMgr.Instance.PlayerSavesList.Count+1}还未使用,请先使用存档{MyCardGameMgr.Instance.PlayerSavesList.Count+1}", () =>
            {
                _txtDic[MyCardGameMgr.Instance.PlayerSavesList.Count+1].text = DateTime.Now.ToString("yyyy-MM-dd HH:mm");
                _stringDic.Add(MyCardGameMgr.Instance.PlayerSavesList.Count + 1,_txtDic[MyCardGameMgr.Instance.PlayerSavesList.Count + 1].text);
                MyCardGameMgr.Instance.PlayerSavesList.Add(MyCardGameMgr.Instance.PlayerSaves);
                /*BinaryMgr.Instance.AutoCreatFile<Dictionary<int,string>>(MyCardGameMgr.Instance.StringDic,false,false);
                BinaryMgr.Instance.AutoCreatFile<List<PlayerSaves>>(MyCardGameMgr.Instance.PlayerSavesList,false,false);*/
                UIMgr.Instance.HidePanel<TipPanel>(true);
            }, () =>
            {
                UIMgr.Instance.HidePanel<TipPanel>(true);
            },$"使用存档{MyCardGameMgr.Instance.PlayerSavesList.Count+1}","放弃存档");
        else
        {
            SaveThis(num,_txtDic[num]);
        }
    }

你会发现他们能够成功适配各种环境了,并且在整场游戏之中都能够调用。

以上是我对于有选项的提示面板的制作思路,如果你有更好的欢迎与我交流。此篇提供思路以及部分源码,希望大家能够喜欢,有帮助就请点赞收藏吧!

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

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

相关文章

软件测试:postman详解

一、Postman背景介绍 用户在开发或者调试网络程序或者是网页B/S模式的程序的时候是需要一些方法来跟踪网页请求的&#xff0c;用户可以使用一些网络的监视工具比如著名的Firebug等网页调试工具。今天给大家介绍的这款网页调试工具不仅可以调试简单的css、html、脚本等简单的网…

自动驾驶系列—全面解析自动驾驶线控制动技术:智能驾驶的关键执行器

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

小阿轩yx-案例:jenkins部署Maven和NodeJS项目

小阿轩yx-案例&#xff1a;jenkins部署Maven和NodeJS项目 前言 在 Java 项目开发中&#xff0c;项目的编译、测试、打包等是比较繁琐的&#xff0c;属于重复劳动的工作&#xff0c;浪费人力和时间成本。以往开发项目时&#xff0c;程序员往往需要花较多的精力在引用 jar 包搭…

8月AI绘画方向APP用户量及人均时长排行榜

全球用户量Top10&#xff08;APP&#xff09; 排名 产品名 分类 8月MAU 上月对比 1 Remini 人工智能修图 29.14M -0.88% 2 FaceApp AI 人脸编辑器 26.46M 0.14% 3 Hypic Photo Editor & AI Art 17.37M 5.74% 4 AI Mirror AI Art Photo Editor 16.81…

【第三版 系统集成项目管理工程师】第16章 监理基础知识

持续更新。。。。。。。。。。。。。。。 【第三版】第十六章 监理基础知识 16.1 监理的意义和作用1.监理的地位和作用(非重点)-P5692.监理的重要性与迫切性-P5703.监理技术参考模型-P570 16.2 监理相关概念1.信息系统工程监理-P5722.信息系统工程监理单位-P5723.业主单位-P57…

LeNet学习

Lenet是一个 7 层的神经网络&#xff0c;包含 3 个卷积层&#xff0c;2 个池化层&#xff0c;1 个全连接层。其中所有卷积层的所有卷积核都为 5x5&#xff0c;步长 strid1&#xff0c;池化方法都为全局 pooling&#xff0c;激活函数为 Sigmoid&#xff0c;网络结构如下&#xf…

25重庆长安深蓝控制器开发面试经验 深蓝最常见面试问题总结

【面试经历】 秋招气氛组选手的第一场面试,9.17网申,9.24电话约面,9.26线上面试。问得很细,全长约1个小时 1. 自我介绍、项目介绍 2.项目细节,遇到了哪些困难;有没有PCB设计经验DC-DC芯片选型,电源噪声的原因、怎么消除、 3.画BUCK和BOOST拓扑图,讲原理 4.了解MCU的主…

ffmpeg面向对象——拉流协议匹配机制探索

目录 1.URLProtocol类2.协议匹配的基础接口3. URLContext类4. 综合调用流程图5.rtsp拉流协议匹配流程图及对象图5.1 rtsp拉流协议调用流程图5.2 rtsp拉流协议对象图 6.本地文件调用流程图及对象图6.1 本地文件调用流程图6.2 本地文件对象图 7.内存数据调用流程图及对象图7.1 内…

李宏毅深度学习-梯度下降和Batch Normalization批量归一化

Gradient Descent梯度下降 ▽ -> 梯度gradient -> vector向量 -> 下图中的红色箭头&#xff08;loss等高线的法线方向&#xff09; Tip1: Tuning your learning rates Adaptive Learning Rates自适应lr 通常lr会越来越小 Adaptive Learning Rates中每个参数都给它不…

基于依赖注入技术的.net core WebApi框架创建实例

依赖注入&#xff08;Dependency Injection, DI&#xff09;是一种软件设计模式&#xff0c;用于实现控制反转&#xff08;Inversion of Control, IoC&#xff09;。在ASP.NET Core中&#xff0c;依赖注入是内置的核心功能之一。它允许你将应用程序的组件解耦和配置&#xff0c…

【JAVA开源】基于Vue和SpringBoot的服装生产管理系统

本文项目编号 T 066 &#xff0c;文末自助获取源码 \color{red}{T066&#xff0c;文末自助获取源码} T066&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

【LVGL进阶日记】① 开源LVGL在MCU上的移植

关注+星标公众号,不错过精彩内容 作者 | 量子君 微信公众号 | 极客工作室 【LVGL进阶日记】专栏目录 第一章 开源LVGL在MCU上的移植 文章目录 前言一、LVGL介绍1.1 LVGL的主要特性如下:1.2 LVGL对MCU的要求如下:二、移植LittlevGL到MCU2.1 LVGL源码下载和文件组织2.2 LVGL配…

【AI人工智能】文心智能体,你的情诗小助理,哄女朋友必备, 低代码工作流易上手,干货满满,不容错过哦

&#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精通 &#x1f601; 2. 毕业设计专栏&#xff0c;毕业季咱们不慌忙&#xff0c;几百款毕业设计等你选。 ❤️ 3. Python爬虫专栏…

数字图像处理项目——基于Unet网络实现MRI图像的双肺区域分割(论文/代码)

完整的论文代码见文章末尾 以下为核心内容 摘要 在医学图像处理领域&#xff0c;肺部图像的分割是一个重要的研究方向&#xff0c;特别是针对肺部疾病的检测与诊断。传统的X射线和CT&#xff08;计算机断层扫描&#xff09;是常用的肺部成像技术&#xff0c;但MRI&#xff08…

I/O多路转接

目录 一、select 1.1、select概念 1.2、select 函数原型 1.3、理解 select 执行过程 1.4、select就绪条件 1.4.1、读就绪 1.4.2、写就绪 1.4.3、异常就绪&#xff08;了解&#xff09; 1.5、select 基本工作流程 1.6、select服务器 1.6.1、Sock.hpp 1.6.2、selectS…

python实战四:输入一个年份,判断是否是闰年

问题&#xff1a; 从键盘获取一个四位的整数年份&#xff0c;判断其是否是闰年。闰年的判断条件为︰能被4整除但不能被100整除&#xff0c;或者能被400整除。 需求方法&#xff1a; 使用 input() 函数从键盘获取输入。输入的年份是一个字符串。检查输入是否为四位数&#xf…

Elasticsearch学习笔记(四) Elasticsearch集群安全配置一

继续我们的实验。先谈一下我对Elasticsearch粗浅的一些认识&#xff0c;首先Elasticsearch是一个非常宏大的技术栈&#xff0c;发展到今天围绕着Elasticsearch已经产生了更多的组件、套件。因此在看官方文档或者别人的一些教程的时候经常会遇到ELK,elastic stack等。elastic st…

如何在电脑上浏览手机界面

联想浏览器中&#xff0c;点击右键-》检查&#xff0c;进入开发者工具&#xff1a; 点击如上&#xff0c;红色框框选中的手机浏览模式即可。

【微服务】服务注册与发现、分布式配置管理 - Nacos

概述 Nacos是阿里巴巴旗下的一个开源产品&#xff0c;目前市场使用率还是比较高的。在最初开源时&#xff0c;Nacos选择内部三个产品合并并统一开源&#xff0c;这三个产品分别是&#xff1a;非持久化注册中心&#xff08;Configserver&#xff09;、持久化注册中心&#xff0…

InnoDB 事务模型

文章目录 InnoDB 事务模型事务ACID特性事务隔离级别 事务操作事务并发问题事务数据读写类型Consistent Nonlocking Reads 快照读Locking Reads 加锁读 MVCC 并发控制实现原理InnoDB 隐藏列Read ViewUndo log实现过程 MVCC与隔离级别MVCC和辅助索引 幻读可重复读MVCC会出现幻读的…