每次加载场景时,背景音乐都会变响
本文关键字:背景音乐 加载 | 更新日期: 2023-09-27 18:21:10
我在 level01 有一个GameObject
,上面有一个Audio Source
,下面有script
。当游戏开始时,脚本运行并开始播放音乐。
我遇到的问题是,每次我加载一个新关卡时,声音都会变得更响亮。我不明白为什么会这样。有人可以解释为什么并给出解决方案或指出我正确的方向吗?
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++;
}
}
}
编辑:我看到你的答案是你的相机只是更接近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;
}
}
}
由于实例是静态的,因此每个音乐管理器脚本都可以访问它。如果已经设置好了,它们在创建时会自我毁灭。