1

我有一个GameObjecton level01Audio Sourcescript以下。当游戏开始时,脚本运行并开始播放音乐。

我遇到的问题是每次加载新级别时声音都会变大。我不明白为什么会这样。有人可以解释原因并给出解决方案或指出正确的方向吗?

using UnityEngine;
using System.Collections;

public class MusicManagerScript : MonoBehaviour
{
    public AudioClip[] songs;
    int currentSong = 0;

    // Use this for initialization
    void Start() {
        DontDestroyOnLoad(gameObject);
    }

    // Update is called once per frame
    void Update() {
        if (audio.isPlaying == false) {
            currentSong = currentSong % songs.Length;
            audio.clip = songs[currentSong];
            audio.Play();
            currentSong++;
        }
    }
}
4

1 回答 1

1

编辑:我看到你的回答是你的相机只是更接近 3D 音频源,但我还是把我的答案放在这里,因为它是一个常见问题的常见解决方案。

每次进入带有音乐管理器的场景时,您都在实例化您的音乐管理器,但您永远不会破坏复制声音的音乐管理器。你需要的是一个单例——一种告诉你的代码永远不允许多个实例的方法。尝试这个:

public class MusicManagerScript : MonoBehaviour
{
    private static MusicManagerScript instance = null;

    public AudioClip[] songs;
    int currentSong = 0;

    void Awake()
    {
        if (instance != null)
        {
            Destroy(this);
            return;
        }
        instance = this;
    }

    // Use this for initialization
    void Start()
    {
        DontDestroyOnLoad(gameObject);
    }

    // Update is called once per frame
    void Update()
    {
        if (audio.isPlaying == false)
        {
            currentSong = currentSong % songs.Length;
            audio.clip = songs[currentSong];
            audio.Play();
            currentSong++;
        }
    }

    void OnDestroy()
    {
        //If you destroy the singleton elsewhere, reset the instance to null, 
        //but don't reset it every time you destroy any instance of MusicManagerScript 
        //because then the singleton pattern won't work (because the Singleton code in 
        //Awake destroys it too)
        if (instance == this)
        {
            instance = null;
        }
    }
}

因为实例是静态的,所以每个音乐管理器脚本都可以访问它。如果它已经被设置,它们会在创建时摧毁自己。

于 2014-04-22T13:06:23.283 回答