Разгрузка сцен по-прежнему приводит к продолжению звука + Random не работает правильно - PullRequest
0 голосов
/ 27 февраля 2020

Код предназначен для переключения сцен и выгрузки последней сцены. Это работает, но при случайном нажатии не работает правильно.

Кроме того, звук не выгружается, поэтому я думаю, что при выгрузке сцен произошла ошибка.

Проблема: при выгрузке сцен звук продолжается + При случайном нажатии никакая другая сцена не нажата может быть загружен впоследствии.

Мой код:

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;



public class SceneController : MonoBehaviour
{
    private int _sceneCounter = 0;
    private Scene _lastScene;

    void Awake() {
        SceneManager.LoadSceneAsync("1", LoadSceneMode.Additive);
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Z)) 
        {
            if (_sceneCounter != 0) {
                SceneManager.LoadSceneAsync("1", LoadSceneMode.Additive);
                _sceneCounter = 0;
                _lastScene = SceneManager.GetSceneByName("1");
                SceneUnloader();
            }
        }

        if (Input.GetKeyDown(KeyCode.X))
        {
            if (_sceneCounter != 1) {
                SceneManager.LoadSceneAsync("2", LoadSceneMode.Additive);
                _sceneCounter = 1;
                _lastScene = SceneManager.GetSceneByName("2");
                SceneUnloader();
            }
        }

        if (Input.GetKeyDown(KeyCode.C))
        {
            if (_sceneCounter != 2) {
                SceneManager.LoadSceneAsync("3", LoadSceneMode.Additive);
                _sceneCounter = 2;
                _lastScene = SceneManager.GetSceneByName("3");
                SceneUnloader();
            }

        }

        if (Input.GetKeyDown(KeyCode.V))
        {
            if (_sceneCounter != 3) {
                SceneManager.LoadSceneAsync("4", LoadSceneMode.Additive);
                _sceneCounter = 3;
                _lastScene = SceneManager.GetSceneByName("4");
                SceneUnloader();
            }
        }

        if (Input.GetKeyDown(KeyCode.B))
        {
            if (_sceneCounter != 4) {
                SceneManager.LoadSceneAsync("5", LoadSceneMode.Additive);
                _sceneCounter = 4;
                _lastScene = SceneManager.GetSceneByName("5");
                SceneUnloader();
            }
        }


         if (Input.GetKeyDown(KeyCode.N))
         {
            if (_sceneCounter != 5) {
                SceneManager.LoadSceneAsync("6", LoadSceneMode.Additive);
                _sceneCounter = 5;
                _lastScene = SceneManager.GetSceneByName("6");
                SceneUnloader();
            }
         }

        if (Input.GetKeyDown(KeyCode.M))
        {
            if (_sceneCounter != 6) {
                SceneManager.LoadSceneAsync("7", LoadSceneMode.Additive);
                _sceneCounter = 6;
                _lastScene = SceneManager.GetSceneByName("7");
                SceneUnloader();
            }
        }

        if (Input.GetKeyDown(KeyCode.P))
        {
            SceneManager.LoadSceneAsync(UnityEngine.Random.Range(0, 6));
            _sceneCounter = 7;
        }

    }

    private void SceneUnloader() {
        if (_lastScene != null) {
            SceneManager.UnloadSceneAsync(_lastScene);
            Debug.Log("SceneUnloaded");
        }
    }

1 Ответ

1 голос
/ 27 февраля 2020

При случайной загрузке сцены вы забыли добавить режим

LoadSceneMode.Additive

Таким образом, вы загружаете сцену в одиночном режиме

Также: имейте в виду, что вы получаете int в случайном диапазоне, так что он будет загрузить номер сцены в настройках сборки. Звоните

UnityEngine.Random.Range(0, 6).ToString() 

для загрузки по имени сцены

И в вашем случайном загрузчике вы не сохраняете

 _lastScene 

и заполняете

_sceneCounter 

неправильно. Поэтому вы должны сделать что-то вроде этого:

if (Input.GetKeyDown(KeyCode.P))
{
    // This can be cleaner, just for logic to not load current scene
    int randomScene = UnityEngine.Random.Range(0, 6);
    while (_sceneCounter == randomScene)
    {
        randomScene = UnityEngine.Random.Range(0, 6);
    }
    _sceneCounter = randomScene;            
    SceneManager.LoadSceneAsync(_sceneCounter.ToString(), LoadSceneMode.Additive);
    _lastScene = SceneManager.GetSceneByName(_sceneCounter.ToString());
    SceneUnloader();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...