当我们进入游戏大厅时,经常有各种弹窗、引导甚至插屏广告需要执行,处理不当时,会导致同时执行的情况,此时我们需要一个弹出管理器统一管理弹出顺序,弹出关闭后是否可以继续执行下一个弹出等。
配置表:

public partial class PopConfig{// 属性定义
/// <summary>/// 弹出唯一ID/// </summary>public string Id;/// <summary>/// 备注/// </summary>public string Des;/// <summary>/// 权重,权重越大,排序越靠前/// </summary>public int Weight;/// <summary>/// 关闭类型/// /// 0.关闭后不执行其他操作/// 1.关闭后触发下一个弹出/// </summary>public int CloseType;
// 函数接口
public static PopConfig[] GetDatas(){ return Datas;}

// PopConfig 共计 [10] 条数据
public static PopConfig[] Datas = new PopConfig[]{new PopConfig{ Id="Sigin", Des="签到弹窗", Weight=1000, CloseType=1, },new PopConfig{ Id="SavePreview", Des="拯救关卡预览", Weight=950, CloseType=0, },new PopConfig{ Id="RateUs", Des="评价", Weight=950, CloseType=1, },new PopConfig{ Id="RemoveAds", Des="购买去广告", Weight=1100, CloseType=1, },new PopConfig{ Id="BuildingGuide", Des="装修引导", Weight=2000, CloseType=1, },new PopConfig{ Id="LevelGuide", Des="装修完成后关卡引导", Weight=750, CloseType=1, },new PopConfig{ Id="PlayInterstitialAd", Des="播放广告", Weight=4000, CloseType=1, },new PopConfig{ Id="EnergyGuide", Des="体力引导", Weight=3000, CloseType=1, },new PopConfig{ Id="ComeInGameGuide", Des="3-5关弱引导", Weight=960, CloseType=1, },new PopConfig{ Id="BuildingPop", Des="装修自动弹窗", Weight=900, CloseType=1, },};
}

弹出管理器:

using Newtonsoft.Json;
using SG.UI;
using SG.Utils;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;//弹出Id,和PopConfig配置表ID一致
public enum PopId
{Null,Sigin,SavePreview,RateUs,RemoveAds,BuildingGuide,LevelGuide,PlayInterstitialAd,EnergyGuide,ComeInGameGuide,BuildingPop,
}
[Serializable]
public class PopData
{public PopId mPopId;public PopConfig mConf;//执行弹出public Action mExePop;//检测弹出是否结束,如:弹窗是否关闭、引导是否完成、插屏广告是否关闭等public Func<bool> mCheckIsEnd;
}public partial class PopManager :  MonoSingleton<PopManager>
{Dictionary<PopId, PopData> mDictPopData= new Dictionary<PopId, PopData>();//正在执行的弹出序列[SerializeField]List<PopData> mPopList = new List<PopData>();//当前正在执行的弹出[SerializeField]PopData mExecutingPopData = null;[SerializeField]bool mIsExcuting = false;protected override void Init(){base.Init();foreach (var item in PopConfig.Datas){var popId = (PopId)Enum.Parse(typeof(PopId), item.Id);mDictPopData.Add(popId, new PopData { mPopId = popId,mConf = item});}mExecutingPopData = null;}public void AddPop(PopId popId, Action exePop, Func<bool> checkIsEnd){if (exePop != null && checkIsEnd != null){PopData data;if (mDictPopData.TryGetValue(popId, out data)){data.mExePop = exePop;data.mCheckIsEnd = checkIsEnd;mPopList.Add(data);}else{DebugUtils.LogError("=========>AddPop:" + popId.ToString() + "   " + mDictPopData.Count);}}}public void BeginExecute(){mIsExcuting = true;}//结束执行弹出逻辑public void EndExecute(){mIsExcuting = false;foreach (var item in mPopList){item.mCheckIsEnd = null;item.mExePop = null;}mExecutingPopData = null;mPopList.Clear();}//执行弹出逻辑void Execute(){if (mPopList.Count > 0 && mIsExcuting){mPopList.Sort(Sort);mExecutingPopData = mPopList[0];DebugUtils.Log("=============>PopManager.Execute:" + mExecutingPopData.mPopId + "   " + Time.realtimeSinceStartup);mPopList.RemoveAt(0);try{UIManager.Instance.LockScreen(0.33f);mExecutingPopData.mExePop.Invoke();}catch (Exception e){DebugUtils.LogError(e.Message + "\n" + e.StackTrace);}}else{mExecutingPopData = null;DebugUtils.Log("========PopManager.Execute: mPopList.Count = 0");}}int Sort(PopData data1, PopData data2){if (data1.mConf.Weight > data2.mConf.Weight){return -1;}else{return 1;}}private void Update(){if (mIsExcuting){if (mExecutingPopData != null && mExecutingPopData.mPopId != PopId.Null){if (mExecutingPopData.mCheckIsEnd()){if (mExecutingPopData.mConf.CloseType == 1){Execute();}else{mExecutingPopData = null;EndExecute();}}}else{if (mPopList.Count > 0){Execute();}}}}
}

Unity开发--进入游戏大厅时游戏中常用的弹窗管理相关推荐

  1. 360游戏大厅打不开HTML游戏,win7系统无法打开360游戏大厅玩游戏的解决方法

    很多小伙伴都遇到过win7系统无法打开360游戏大厅玩游戏的困惑吧,一些朋友看过网上零散的win7系统无法打开360游戏大厅玩游戏的处理方法,并没有完完全全明白win7系统无法打开360游戏大厅玩游戏 ...

  2. Git之(三)Git中常用命令——分支管理

    三.Git中常用命令--分支管理 为什么要使用分支管理? 分支就是科幻电影里面的平行宇宙,也就是当你正在电脑前努力学习Git的时候,另一个你正在另一个平行宇宙里努力学习SVN. 如果两个平行宇宙互不干 ...

  3. Unity开发–跑酷教育类小游戏

    Unity开发–跑酷教育类游戏 游戏链接: PICK YOUR PLATE 游戏截图: 介绍 -游戏名字 PICK YOUR PLATE -游戏类型 无尽跑酷,严肃游戏 -游戏主题 均衡饮食 -游戏受 ...

  4. 用Unity开发一款塔防游戏(一):攻击方设计

    大家好.偶尔想起了这个手把手教学的.但现已长满杂草的坑,还是来挖几铲子. 这一期的游戏是最常见的类型之一--塔防. 塔防游戏相信大家并不陌生,几个主要元素如下: 1.敌方士兵 2.我方防御塔 3.我方 ...

  5. 电脑qq游戏程序更改计算机,我的电腦登录游戏大厅时电脑提示程序初始化失败...

    您可以参照下列提示操作下,希望我的回答对您有所帮助! ~ [原因分析]: 1. 虚拟内存不足 2. 游戏启动提示缺少某些D3D文件的报错 3. QQ安装后无法启动及部分游戏启动报错 4. 游戏程序本身 ...

  6. 塔防游戏c语言源代码,用Unity开发一款塔防游戏(一):攻击方设计

    private void Update() { hpObj.rotation = mainCamera.rotation; //血条始终面向镜头 if (GameMain.instance.gameO ...

  7. 网络中常用的队列管理方法比较

    队列管理属于链路IP层的拥塞控制策略,主要是在路由器中采用排队算法和数据包丢弃策略.排队算法通过决定哪些包可以传输来分配带宽,而丢弃策略通过决定哪些包被丢弃来分配缓存. 1.先进先出(FIFO,Fir ...

  8. C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(十一)地图遮罩层的实现

    前面的章节主要针对地图表现层进行讲解.通常来说,简单的游戏光有它就足够了:但是为了达到更加真实的光影效果,模拟真实的虚拟世界,我们还得继续在地图上下大工夫.本节将就如何实现地图中的遮罩层,即物体对角色 ...

  9. 360游戏大厅打不开HTML游戏,360游戏大厅使用过程常见问题解决方法

    玩游戏出现黑屏.白屏 遇到黑屏 遇到黑屏,左上角有红X或提示Flash版本过低时,可尝试在游戏大厅的游戏工具条上点击"修复",选择一键修复后,大厅会智能安装.升级Flash. 遇到 ...

最新文章

  1. Vagrant安装指南
  2. 解决异常:“The last packet sent successfully to the server was 0 milliseconds ago. ”的办法
  3. Xamarin Essentials教程陀螺仪Gyroscope
  4. rabbitmq如何保证消息不被重复消费_RabbitMQ保证消息可靠投递与消费的正确使用姿势...
  5. toj 3616 Add number (没想到啊~~)
  6. JS----贪吃蛇游戏
  7. 微课|玩转Python轻松过二级(3.4节):集合操作与应用
  8. 深入理解Tomcat系列之五:Context容器和Wrapper容器
  9. java继承中的初始化顺序
  10. Directionally Localized Anti-Aliasing
  11. 疫情在家办公,向日葵突然卡死,无法远程电脑的解决办法(局域网远程强制重启windows)
  12. webservice解析xml文件
  13. 教你如何真正玩转XP共享
  14. c语言常用基础代码大全,C语言基础入门必读
  15. Matlab中将横纵坐标改为自定义标签(set(gca,xtick)set(gca,xticklabel))
  16. 2018年,NB-IoT这盘大棋该怎么下?
  17. 10-STM32F1-RTC and BKP
  18. MVC、MVP、MVVM模式的概念与区别
  19. 扔掉信用卡的10个理由
  20. Source Insight 许可证激活

热门文章

  1. 如何防止亚马逊账号关联的一些建议值得卖家们收藏?
  2. LabVIEW崩溃后如何排查故障
  3. 【Linux记录】Linux 可以telnet通localhost,不能telnet ip,telnet localhost正常,telnet ip失败。
  4. EXCEL数据分析——分列
  5. Mac使用数据线连接安卓手机传输文件
  6. OpenCV简单实现PhotoShop图层混合
  7. CAP迷思:关于分区容忍性
  8. C语言实现将彩色BMP位图转化为二值图
  9. 编程实现Z=5X+3Y+10,设已知变量和结果均放在数据段
  10. Java-AQI计算