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