Стандартный
SceneManager.LoadScene вызывает фриз — не годится для нормального проекта. Сделаем правильно: с экраном загрузки, прогрессом и без тормозов.
Пока сцена грузится, крутим анимацию и показываем проценты.
1. Создай пустые объекты Menu и Load, меню и экран загрузки соответственно.
2. Прикрепи к ним необходимый UI
Кнопка должна запускать
LoadScene()using System.Collections;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class Play : MonoBehaviour
{
[Header("UI Elements")]
[SerializeField] private Slider progressSlider;
[SerializeField] private TextMeshProUGUI progressText;
[SerializeField] private GameObject start;
[SerializeField] private GameObject load;
// Обновляет слайдер и текст прогресса
void UpdateProgressUI(float progress)
{
progressSlider.value = progress;
progressText.text = $"{progress * 100:F0}%";
}
// Вызывается при нажатии кнопки "Играть"
public void LoadScene()
{
start.SetActive(false);
load.SetActive(true);
StartCoroutine(LoadAsync(1));
}
// Асинхронная загрузка сцены с отображением прогресса
IEnumerator LoadAsync(int sceneName)
{
AsyncOperation operation = SceneManager.LoadSceneAsync(sceneName);
operation.allowSceneActivation = false; // не переключаемся сразу
// Ждём, пока загрузка не достигнет 90%
while (operation.progress < 0.9f)
{
float progress = Mathf.Clamp01(operation.progress / 0.9f);
UpdateProgressUI(progress);
yield return null;
}
// Достигли 90% — показываем 100% и делаем паузу
UpdateProgressUI(1f);
yield return new WaitForSeconds(0.5f); // можно заменить на ожидание нажатия
// Разрешаем переход на новую сцену
operation.allowSceneActivation = true;
}
}
💡 Хитрость:
operation.progress идёт до 0.9, а последние 10% — активация сцены. Поэтому масштабируем
progress / 0.9f и уже на 1.0 переводим.💬 Как загружаешь сцены ты? Асинхронно или всё ещё грузишь синхронно и терпишь фризы?
🔔 Подписывайся — дальше разберём ECS.
👉Akrus Games | Unity