Автор: RimuruDev
Лицензия: MIT
Unity Scene Pause System предоставляет простой и эффективный способ управлять паузой и возобновлением игрового процесса в сценах Unity. Этот пакет позволяет разработчикам легко приостанавливать и возобновлять игру, управлять объектами, реагирующими на паузу, и обрабатывать различные сценарии паузы.
Если вы используете Time.timeScale = 0
для реализации паузы в игре, и считаете что это вам подходит лучше всего. Тогда можете скипать это решение. Но если костыля в виде Time.timeScale = 0
теперь не хватает, тогда добро пожаловать.
- Легкая интеграция в существующие проекты Unity.
- Гибкое управление паузой с помощью интерфейсов и абстрактных классов.
- Поддержка пользовательских запросов паузы через класс
PauseRequest
. - Примеры использования для быстрого старта.
-
Добавьте ссылку на Git репозиторий в Unity:
-
Откройте ваш проект Unity.
-
Перейдите в Window > Package Manager.
-
Нажмите на кнопку + в левом верхнем углу и выберите Add package from git URL....
-
Введите URL репозитория:
https://github.com/RimuruDev/Unity-ScenePauseSystem.git
-
Нажмите Add, и пакет будет установлен в ваш проект.
-
- Скачайте или склонируйте репозиторий к себе на компьютер.
- В Unity перейдите в Window > Package Manager.
- Нажмите на кнопку + и выберите Add package from disk....
- Укажите путь к файлу
package.json
в корне скачанного репозитория. - Пакет будет добавлен в ваш проект.
- Создайте пустой GameObject в вашей сцене.
- Переименуйте его в
PauseSystem
(по желанию для удобства). - Добавьте компонент
PauseSystem
из пространства именAbyssMoth.ScenePauseSystem
.
Используйте этот вариант, если ваш скрипт может наследоваться от PausableBehaviour
.
using UnityEngine;
using AbyssMoth.ScenePauseSystem;
public class MyPausableComponent : PausableBehaviour
{
private protected override void OnUpdate()
{
// Ваш код, который выполняется, когда игра не на паузе
}
private protected override void OnFixedUpdate()
{
// Ваш код для FixedUpdate, если необходимо
}
private protected override void OnLateUpdate()
{
// Ваш код для LateUpdate, если необходимо
}
}
Если вы не можете наследоваться от PausableBehaviour
, реализуйте интерфейс IPausable
.
using UnityEngine;
using AbyssMoth.ScenePauseSystem;
public class MyPausableComponent : MonoBehaviour, IPausable
{
public bool IsPaused { get; private set; }
private void Update()
{
if (IsPaused)
return;
// Ваш код
}
public void Pause(in PauseRequest request, Object sender = null)
{
IsPaused = true;
// Дополнительная логика при паузе
}
public void Resume(in PauseRequest request, Object sender = null)
{
IsPaused = false;
// Дополнительная логика при возобновлении
}
}
Для управления паузой используйте методы PauseGame
и ResumeGame
компонента PauseSystem
.
using UnityEngine;
using AbyssMoth.ScenePauseSystem;
public class PauseController : MonoBehaviour
{
[SerializeField] private PauseSystem pauseSystem;
private void Update()
{
if (Input.GetKeyDown(KeyCode.P))
{
if (pauseSystem.IsPaused)
{
// Возобновляем игру
pauseSystem.ResumeGame(new PauseRequest { IsPerformSettings = true }, this);
}
else
{
// Ставим игру на паузу
pauseSystem.PauseGame(new PauseRequest { IsPerformSettings = true }, this);
}
}
}
}
Класс PauseRequest
позволяет передавать дополнительную информацию о причине паузы или возобновления.
Пример постановки игры на паузу при победе:
public void OnPlayerVictory()
{
var request = new PauseRequest { IsVictory = true };
pauseSystem.PauseGame(request, this);
}
В вашем паузируемом компоненте вы можете обработать этот запрос:
public class VictoryHandler : PausableBehaviour
{
public override void Pause(in PauseRequest request, Object sender = null)
{
base.Pause(request, sender);
if (request.IsVictory)
{
// Логика при победе (например, показать экран победы)
}
}
}
Пример компонента, который пишет сообщения в консоль, когда игра не на паузе.
using UnityEngine;
using AbyssMoth.ScenePauseSystem;
public class InfinityDebugLogWriter : PausableBehaviour
{
private protected override void OnUpdate()
{
Debug.Log($"Сообщение от {nameof(InfinityDebugLogWriter)}");
}
}
Пример реализации IPausable
без наследования от PausableBehaviour
.
using UnityEngine;
using AbyssMoth.ScenePauseSystem;
public class InfinityColorDebugLogWriter : MonoBehaviour, IPausable
{
public bool IsPaused { get; private set; }
private void Update()
{
if (IsPaused)
return;
Debug.Log("<color=yellow>Цветное сообщение!</color>");
}
public void Pause(in PauseRequest request, Object sender = null)
{
IsPaused = true;
// Дополнительная логика при паузе
}
public void Resume(in PauseRequest request, Object sender = null)
{
IsPaused = false;
// Дополнительная логика при возобновлении
}
}
PauseRequest
содержит следующие поля, которые вы можете использовать для передачи дополнительной информации:
- IsPerformSettings: пауза вызвана открытием настроек.
- IsVictory: пауза вызвана победой игрока.
- IsDefeat: пауза вызвана поражением игрока.
- IsShowAd: пауза для показа рекламы.
- IsEndSceneLifeCycle: пауза из-за окончания жизненного цикла сцены.
- IsChangedApplicationFocus: изменение фокуса приложения.
- IsChangedOnApplicationPause: приложение поставлено на паузу (например, свернуто).
Вы можете переопределить методы Pause
и Resume
в ваших компонентах для выполнения дополнительной логики при паузе или возобновлении.
public class CustomPausableComponent : PausableBehaviour
{
public override void Pause(in PauseRequest request, Object sender = null)
{
base.Pause(request, sender);
// Ваша дополнительная логика при паузе
}
public override void Resume(in PauseRequest request, Object sender = null)
{
base.Resume(request, sender);
// Ваша дополнительная логика при возобновлении
}
}
Мы приветствуем вклад сообщества! Если вы хотите помочь развитию проекта:
- Сообщайте об ошибках: создавайте Issues на GitHub.
- Вносите изменения: делайте форки и отправляйте пул-реквесты.
- Предлагайте улучшения: делитесь идеями и предложениями.
Этот проект лицензирован под лицензией MIT. Подробности смотрите в файле LICENSE.
- Автор: RimuruDev
- Email: rimuru.dev@gmail.com
- GitHub: github.com/RimuruDev
Спасибо за использование Unity Scene Pause System! Мы надеемся, что этот пакет облегчит разработку вашего проекта. Если у вас есть вопросы или нужна помощь, не стесняйтесь обращаться.
- Добавить нормальную XML документацию к коду.
- Добавить примеры для инъекций PauseSystem к IPauseSystem в локальном контексте сцены.
- Добавить расширение редактора для аркестрации PauseSystem
- Добавить удобное расширения для быстрого получения доступа к IPauseSystem для случая когда на проекте не используется DI, но при этом без DontDestroyOnLoad и проблем синглтонов. Реализовать через смесь MonoSingleton + паттерн NullObject.
- Добавить запекание (кэширование) для PauseSystem.