=> GuardHei

Illusory Walls Ahead

F+ or Deferred? Which one should I choose?


Here we go again!

Unity中实现通知系统

概述

游戏过程中经常会有消息进行通知。比如说解锁了成就,获得了奖励,或者说某一步操作成功。简单说说我是怎么实现的。

实现

首先,我们要创建一个NotificationManager的脚本,继承自MonoBehaviour。由于在游戏中只有一个通知系统,而且存在于多个场景里,所以在Start()方法里,我们要加一句DontDestroyOnLoad(gameObject);保证切换场景的时候不被销毁。我们再创建一个类NotificationModel作为输入的数据结构,拥有以下属性;

  1. Title 标题 string public
  2. Type 种类(警告,提示,成就解锁等等)enum public
  3. Content 内容 string public
  4. Duration 时长 float public

现在,我们在NotificationManager里维护一个静态的通知队列来存储通知信息。

static Queue<NotificationModel> notifications = new Queue<NotificationModel>();

这时我们就可以添加一个AddNotification()添加通知的方法了。

public static void AddNotification(NotificationModel model) {
    notifications.Enqeue(model);
    if (notifications.Count == 1) {
        // do display work;
    }
}

非常简单的代码,就是把model推进队列里,如果队列里的通知数等于1,即只有这条新消息的时候就进行展示的工作。 接下来我们就写一下展示的代码DisplayNotification();

static void DisplayNotification() {
    // Load Up Notification Bar
    // 刷新显示通知条ui,具体代码就不写了
    notificationBar.SetActive(true); // 激活通知条ui
    gameObject.GetComponent<NotificationManager>().StartCoroutine(ExeDisplayTask(notifications.Peek()));
}

static IEnumerator ExeDisplayTask(NotificationModel model) {
    yield return new WaitForSeconds(model.duration); // 过一段时间使通知消失
    notifications.Deqeue(); // 让通知从队列里弹出
    notificationBar.SetActive(false); // 休眠通知条ui
    if (notifications.Count > 0) { // 通知数量大于0,说明还有通知可以展示
        DisplayNotification();
    }
}

这样基本就搞定了一个通知系统,注意的是最好把通知系统的Canvas作为Notification Manager搭载GameObject的子物体,这样使Canvas也不会跟随场景销毁。为了方便以后调用,可以把常用的配置写成常量或者默认值,然后Overload一下AddNotification()方法,比如说快捷的一个参数的方法。这里面的单例用法有点奇怪,更好用的方法我会在后面的博客里说 – MonoBehaviour的单例。

Recent Articles

Unity中使用Delegate, Action, Func, Reflection, UnityAction动态调用函数优劣对比

概述在游戏开发中(其实别的领域也一样啦),为了保证代码框架的灵活,低耦合,拓展性强,许多时候需要动态地调用函数。在C++里面,一种特殊的指针,函数指针,承担了传递函数的功能。Javascript里也有高级函数这么一说来将函数也作为参数使用。C#作为一门拥有许多特性的现代编程语言来说,提供了多种解决方法。比较 以下内容不会特别具体介绍各个方法该如何使用,而是从实现机制这一角度来分析运行效率等方面(如果有错,请指出😂)。使用Delegate机制Delegate,直接翻译就是委托,本质上是像C...…

UnityContinue
Earlier Articles

Unity AssetBundle使用的几个坑

概述为了实现热更新,我在最新的项目里使用了AssetBundle, 每次初始化资源的时候从本地AssetBundle文件了动态加载资源并设置默认值,里面有一些坑要注意一下,在此记录,以免后面忘了资源重复加载的问题当游戏在中途进行了一些重新开始或者退到初始化界面的时候,会重新加载AssetBundles。这个时候会报错 “不能重复加载相同的AssetBundle”。我一开始是在资源加载完之后加一句Unload(); 但是后面发现这样有点问题,Unload后有可能会销毁已经加载的资源,所以要加...…

UnityContinue