Есть ли способ заставить музыку звучать беззвучно в одних сценах, а в других - в единстве? - PullRequest
0 голосов
/ 29 декабря 2018

Я делаю игру, в которой я хочу, чтобы в некоторых сценах музыка звучала через них, казалось бы, заставляла музыку останавливаться, когда я выхожу из этих сцен, и автоматически возобновлять, когда я возвращаюсь к ним.

iЯ пытался создать список (массив) сцен, в которых я хочу воспроизвести музыку, и проверить имя текущей сцены, чтобы увидеть, находится ли она в списке или нет. Но он не работает, когда я набираю .contains, чтобы проверитьответ.

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

public class DontDestroy : MonoBehaviour {
void Awake(){
        print ("WoW");
        GameObject[] objs = GameObject.FindGameObjectsWithTag 
("music");
        if (objs.Length > 1) 
        {
         Destroy (this.gameObject);
        }
        DontDestroyOnLoad (this.gameObject);
     }      
}

Я использую это для поддержания воспроизведения музыки при переключении сцен, а не для дублирования при возвращении к исходной сцене.как бы я ни хотел, чтобы это работало в определенном количестве сцен.

1 Ответ

0 голосов
/ 31 декабря 2018

Сначала я бы использовал шаблон Singleton вместо всех, используя Find

Чем зарегистрировать слушателя на SceneManager.sceneLoaded

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

public class PlayMusik : MonoBehaviour
{
    private static PlayMusik Singleton;

    // Here you reference the secenes where music should be playing
    public List<Scene> scenesWithMusik;

    // Flag to control of music is playing
    private bool isPlayingMusik;

    private void Awake ()
    {
        if(Singleton)
        {
            Debug.Log("Already another PlayMusik in Scene.", Singleton);
            Debug.Log("Destroying this one", this);

            Destroy(gameObject);
            return;
        }

        Singleton = this;
        DontDestroyOnLoad(gameObject);

        // Make sure listener is only added once
        SceneManager.sceneLoaded -= OnSceneLoaded;
        SceneManager.sceneLoaded += OnSceneLoaded;
    }

    private void OnDestroy ()
    {
        // Cleanup listener
        SceneManager.sceneLoaded -= OnSceneLoaded;
    }

    // Called when a scene is loaded
    void OnSceneLoaded(Scene scene, LoadSceneMode mode)
    {
        Debug.Log("OnSceneLoaded: " + scene.name);
        Debug.Log(mode);

        // here you handle what should happen with the music e.g.
        // if the loaded scene is in scenesWithMusic enable music
        // (What should happen if you load a scene additive is up to you)
        if(scenesWithMusik.Contains(scene))
        {
            if(!isPlayingMusik)
            {
                //Todo: Enable Music here!

                isPlayingMusik = true;
            }
        }
        else
        {
            if(isPlayingMusik)
            {
                //Todo: Stop Music here!

                isPlayingMusik = false;
            }  
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...