【Unity】用事件广播的方式实现游戏暂停,简单且实用!
1.前言
在做Unity项目的时候,要考虑到“游戏暂停”的功能,最直接的办法是修改游戏的Time.TimeScale = 0f。但是这种方式的影响也比较大,因为它会导致游戏中很多程序无法正常运行。
于是我就有了一个想法,在游戏中想要暂停的对象,只是希望它的某些行为暂时停止运行,在适当的时机下再让它启用。
那么我们可以专门设计一个这样的脚本,在暂停事件被触发的时候,来禁用这个对象的某些行为脚本,在暂停结束之后,再让这些脚本重新运行。
2.功能实现
2.1 搭建泛型事件框架
你可以参考我写的这篇文章,里面我提供了详细的搭建过程以及代码,方便你快速应用到你的项目当中:【Unity】搭建泛型事件框架,可广泛应用于中小型的游戏项目!!!_unity事件框架-CSDN博客
2.2 创建BoolEventSO
基于之前搭建的泛型事件框架,我们来创建这个类型(BoolEventListener如果你有需求可以创建,但是在我这个方案里面,可以不创建)
接着请在项目中创建一个BooEventSO的SO文件,取名就叫作OnGamePause吧!
using UnityEngine;
[CreateAssetMenu(fileName = "new BoolEventSO",menuName = "Events/BoolEventSO")]
public class BoolEventSO : BaseEventSO<bool>
{
}
2.3 创建PauseTrigger
PauseTrigger的使用方式没有太大的限制,你可以单独在场景中创建一个空对象,然后把这个脚本挂载上去,在列表中添加你在暂停的时候要禁用的脚本就行。
或者给你需要暂停的对象挂载,然后在列表中添加脚本也可以。
pauseEvent引用之前创建的“OnGamePause”SO文件即可。
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 暂停触发器
/// 说明,用于在暂停事件被触发的时候,禁用指定的脚本
/// </summary>
public class PauseTrigger : MonoBehaviour
{//禁用目标列表public List<MonoBehaviour> pauseTargets = new();//引用暂停事件的SO文件public BoolEventSO pauseEvent;//true表示继续游戏,false表示暂停游戏private void OnGamePause(bool isPause){foreach(var pauseTarget in pauseTargets){pauseTarget.enabled = !value ;}}//注册事件private void OnEnable(){pauseEvent.OnEventRaised += OnGamePause;}//注销事件private void OnDisable(){pauseEvent.OnEventRaised -= OnGamePause;}
}
2.4 激活暂停事件
引用“OnGamePause”,调用里面的RaisedEvent函数,传参数即可。
比如,在某个脚本中,我希望实现点击“暂停”按钮暂停游戏,点击“继续”按钮继续游戏。
下面是节选的核心代码
public BoolEventSO onGamePauseSO;public void OnPauseButtonClick()
{onGamePauseSO?.RaisedEvent(true,this);
}public void OnContinueButtonClick()
{onGamePauseSO?.RaisedEvent(false,this);
}