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

Unity 二级弹窗机制与回调实现原理

一、什么是二级弹窗?

二级弹窗指在一个弹窗上再弹出另一个弹窗,且需要将用户操作结果回传给调用方。

示例场景:

  • 主界面(GamePlayerInfo)→ 点击踢出按钮 → 弹出确认弹窗(ConfirmPopup)
  • 用户点击确认/取消后,主界面需要根据结果执行操作(如销毁玩家项)

二、为什么需要回调机制?

普通弹窗:打开后关闭,调用方不需要知道结果。

二级弹窗:需要知道用户的选择,并根据结果执行后续操作。

问题:弹窗如何将结果传递给调用方?

解决方案:回调机制(Callback Pattern)

三、核心设计:回调接口

// 定义回调接口
public interface IUIResultCallback
{void OnUIResult(string result);
}

设计要点:

  • 接口定义统一的结果接收方法
  • 使用字符串传递结果(可扩展为枚举或对象)
  • 调用方实现该接口,接收结果

四、UIManager:回调的中转站

UIManager 作为回调的中间层,负责:

  1. 保存回调对象
  2. 接收弹窗的结果
  3. 将结果传递给回调对象
public class UIManager : MonoBehaviour
{// 保存当前的回调对象private IUIResultCallback callback;// 打开带回调的UIpublic async ETTask<GameObject> ShowUIWithCallback(IUIResultCallback cb,      // 回调对象string uiName,              // UI名称string tag,                 // UI层级UIOpenActionType iType,     // 打开动画类型params object[] p           // 初始化参数){callback = cb;  // 保存回调对象// 打开UI...Transform node = tag == "pop" ? PopLayer.transform : ...;GameObject Logic = await OpenUI(node, uiName, iType, p);return Logic;}// 发送结果给回调对象public void SendResult(string result){if (callback != null){callback.OnUIResult(result);  // 调用回调方法}}
}

为什么需要 UIManager 中转?

  • 解耦:弹窗不需要知道调用方是谁
  • 统一管理:集中处理回调逻辑
  • 单例模式:全局可访问

五、弹窗:发送结果

弹窗(ConfirmLogic)在用户操作时,通过 UIManager 发送结果:

public class ConfirmLogic : MonoBehaviour, IGameUI
{public void Awake(){BtnSure.onClick.AddListener(() =>{UIManager.instance.SendResult("1");  // 发送确认结果Close();});BtnCancel.onClick.AddListener(() =>{UIManager.instance.SendResult("0");  // 发送取消结果Close();});}
}

要点:

  • 弹窗不直接调用调用方
  • 通过 UIManager 统一发送
  • 使用字符串标识结果(“1”=确认,“0”=取消)

六、调用方:实现回调接口

调用方(GamePlayerInfo)实现 IUIResultCallback,接收结果:

public class GamePlayerInfo : ScrollItem, IUIResultCallback
{public void Awake(){kickBtn.onClick.AddListener(async () =>{// 打开弹窗,传入自身作为回调对象await UIManager.instance.ShowUIWithCallback(this,                    // 传入自身作为回调"ConfirmPopup", "pop", UIOpenActionType.CenterSmallToBig,"确定要踢出该玩家吗?");});}// 实现回调接口,接收弹窗结果public void OnUIResult(string result){if (result == "1")  // 用户点击了确认{// 执行后续操作:发送网络请求、销毁对象等C2S_PlayerLeave msg = C2S_PlayerLeave.Create();msg.Uids.Add(playerUid);GameApp.Send(msg);Destroy(gameObject);}// result == "0" 表示取消,不需要处理}
}

要点:

  • 实现 IUIResultCallback
  • 打开弹窗时传入 this 作为回调
  • OnUIResult 中处理结果

七、完整工作流程

┌─────────────────────────────────────────────────────────┐
│ 1. 用户点击 kickBtn                                      │
└─────────────────────────────────────────────────────────┘↓
┌─────────────────────────────────────────────────────────┐
│ 2. GamePlayerInfo 调用                                   │
│    UIManager.ShowUIWithCallback(this, "ConfirmPopup")   │
└─────────────────────────────────────────────────────────┘↓
┌─────────────────────────────────────────────────────────┐
│ 3. UIManager 保存 callback = this                        │
│    然后打开 ConfirmPopup 弹窗                            │
└─────────────────────────────────────────────────────────┘↓
┌─────────────────────────────────────────────────────────┐
│ 4. 用户点击确认/取消按钮                                  │
└─────────────────────────────────────────────────────────┘↓
┌─────────────────────────────────────────────────────────┐
│ 5. ConfirmLogic 调用                                     │
│    UIManager.SendResult("1" 或 "0")                     │
└─────────────────────────────────────────────────────────┘↓
┌─────────────────────────────────────────────────────────┐
│ 6. UIManager 调用                                        │
│    callback.OnUIResult("1")                              │
└─────────────────────────────────────────────────────────┘↓
┌─────────────────────────────────────────────────────────┐
│ 7. GamePlayerInfo.OnUIResult("1") 被调用                │
│    执行后续操作(发送请求、销毁对象等)                    │
└─────────────────────────────────────────────────────────┘

八、设计模式:回调模式(Callback Pattern)

这是回调模式的典型应用:

  • 定义接口:IUIResultCallback
  • 调用方实现接口:GamePlayerInfo : IUIResultCallback
  • 传递回调对象:ShowUIWithCallback(this, ...)
  • 异步执行:弹窗操作是异步的
  • 结果回调:通过 OnUIResult 返回结果

优点:

  • 解耦:弹窗与调用方解耦
  • 灵活:任何实现接口的类都可以作为回调
  • 可扩展:可以传递多个参数或复杂对象

九、关键要点总结

  1. 接口定义:统一的结果接收接口
  2. 中转管理:UIManager 作为回调的中转站
  3. 结果传递:弹窗通过 UIManager 发送结果
  4. 回调实现:调用方实现接口并处理结果
  5. 解耦设计:弹窗不需要知道调用方是谁

十、适用场景

需要回调机制:

  • 确认对话框(需要知道用户选择)
  • 输入对话框(需要获取用户输入)
  • 选择对话框(需要知道用户选择)

不需要回调机制:

  • 信息展示弹窗(只是查看,无需反馈)
  • 提示弹窗(只是提示,无需操作)
  • 独立功能弹窗(不依赖调用方状态)

这个机制的核心思想是:通过接口定义契约,通过 UIManager 中转回调,实现弹窗与调用方的解耦,让弹窗可以灵活地通知调用方用户的操作结果。

http://www.dtcms.com/a/594264.html

相关文章:

  • 面向C++程序员的JavaScript 语法实战学习1
  • 做某网站的设计与实现深圳做网站制作
  • K8S中Ingress的使用
  • 怎么建立微信网站あかねさす少女免费
  • 基于单片机的多波形信号发生器设计
  • JAVA1110 反射 泛型
  • 设计网站大全软件网络营销有哪些功能
  • 余江网站建设河南郑州百姓网
  • 济南莱芜最新消息seo平台是什么意思
  • 银河麒麟高级服务器操作系统V10SP3 2403(X86)PXE服务端部署以及测试
  • 安徽建站优化哪里有八戒八戒在线观看免费完整版
  • 远距离视频传输无线模块:打破空间限制的未来科技
  • Linux网络编程—网络基础概念
  • 硬件基础知识-电容(一)
  • 做网站需要多少钱怎么做网站的百度收录
  • 什么软件可以做网站百度站长平台怎么验证网站
  • 网站建设定制网络营销方式哪些?
  • Python | range数据类型、for循环及应用方式
  • 怎么仿一个复杂的网站wordpress怎么写时间轴
  • HTML5 表单属性详解
  • 官网国产化改造,为何首选PageAdmin CMS?
  • 传感器监测精度:压电 / 温度传感器对心率 / 呼吸信号的捕捉效率测试
  • 十堰优化网站哪家好有免费做推广的网站吗
  • 网站空间如何续费南昌企业建站系统
  • 底层视觉及图像增强-项目实践(十六-0-(4):从“调屏经验”到“AI慧眼【神经网络、卷积】”的思维跃迁):从奥运大屏,到手机小屏,快来挖一挖里面都有什么
  • dede网站安全东莞金融网站建设
  • 网站页面设计尺寸彩云小梦ai写作网站
  • 培训考试系统源码重要吗
  • Swift-GCD和NSOperation
  • 移动硬盘安装Ubuntu系统——Ubuntu与Windows时间不一致(详细版)_002