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

【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);
}

http://www.xdnf.cn/news/6704.html

相关文章:

  • 5月16日day27打卡
  • LED接口设计
  • R语言学习--Day03--数据清洗技巧
  • day32-多线程juc
  • QML元素 - OpacityMask
  • [BJDCTF2020]The mystery of ip
  • Python 在自动驾驶数据标签中的应用:如何让 AI 读懂道路?
  • 2025年山东省省赛数模竞赛C题完整论文+代码分享
  • 【动态导通电阻】GaN HEMT动态导通电阻的精确测量
  • 罗杰斯高频板技术解析:低损耗基材如何定义 5G 通信未来
  • tauri2项目使用tauri-plugin-updater配置更新程序流程
  • 如何阅读、学习 Tcc (Tiny C Compiler) 源代码?如何解析 Tcc 源代码?
  • VsCode和AI的前端使用体验:分别使用了Copilot、通义灵码、iflyCode和Trae
  • iOS音视频解封装分析
  • Spring Batch学习,和Spring Cloud Stream区别
  • MySQL面试知识点详解
  • 计算机图形学基础--Games101笔记(一)数学基础与光栅化
  • 生产级编排AI工作流套件:Flyte全面使用指南 — Core concepts Launch plans
  • 非受控组件在 React 中如何进行状态更新?
  • 好用的拓客APP有哪些?
  • C#学习第23天:面向对象设计模式
  • 基于WISE30sec制作中国1km分辨率土壤属性栅格数据(20种属性/0-200cm深度分层)
  • Flask框架搭建
  • 信号灯和旋钮在接地电阻柜内的作用主要包括以下几个方面
  • 吴恩达 Deep Learning(1-36)ppt逐行理解
  • React中使用openLayer画地图
  • 【大模型面试每日一题】Day 20:大模型出现“幻觉”(Hallucination)的可能原因有哪些?如何从数据或训练层面缓解?
  • 支持蓝牙5.0和2.4G私有协议芯片-PHY6222
  • ISBI 2012 EM 神经元结构分割数据集复现UNet
  • 前端实现流式输出《后端返回Markdown格式文本,前端输出类似于打字的那种》