C# Unity如何只有一个源音频?

C# Unity如何只有一个源音频?,c#,unity3d,C#,Unity3d,我有一个带有以下代码的源音频: public class Sound : MonoBehaviour { Static Sound instance; void Awake() { if (instance != null) { Destroy(gameObject); } else { instance =

我有一个带有以下代码的源音频:


public class Sound : MonoBehaviour {

    Static Sound instance;
    

    void Awake() 
    {
        if (instance != null)
        {
            Destroy(gameObject);
        }
        
        else
        {
            instance = this;
            DontDestroyOnLoad(gameObject);
        }
    }


因此,当我改变场景时,音频再次开始播放。如何将其限制为只有1个

编辑:我如何解决这个问题?我得到这个错误
1-类、结构或接口成员声明中的意外符号
实例2-意外符号
;'在类、结构或接口成员声明中

选项1:

在这种情况下,单例模式可能是您的最佳选择。Singleton模式的目的是将一个类限制为其自身的一个实例。要了解有关该模式的更多信息,请参阅其上的

看起来您已经在这样做了(在第一次编辑之后),但是您要更改的是代码中
Static
的大小写<代码>静态
静态
是两件不同的事情。为了您的利益,您正在寻找
静态
。这将修复您的问题/错误,并允许您正确使用单例模式

选项2:

另外,如果你想避免典型的单件游戏模式,另一个选择是在所有游戏对象中搜索你的
Sound
Class/Component。然后,如果场景中已经出现了,让试图实例化的游戏对象销毁自己。可以使用以下代码执行此操作:

public class Sound : MonoBehaviour 
{
    void Awake() 
    {
        int numSoundInstances = FindObjectsOfType<Sound>().Length;
        if (numSoundInstances > 1)
        {
            Destroy(this.gameObject);
        }
    
        else
        {
            DontDestroyOnLoad(this.gameObject);
        }
    }
}
公共类声音:单一行为
{
无效唤醒()
{
int numSoundInstances=FindObjectsOfType().Length;
如果(numSoundInstances>1)
{
摧毁(这个游戏对象);
}
其他的
{
DontDestroyOnLoad(this.gameObject);
}
}
}

在我看来,这比使用单例模式的效率要低。这是因为使用FindObjectsOfType会强制代码检查当前游戏中的每个游戏对象。根据游戏中游戏对象的数量,这可能会对系统造成很大的负担。

如何只制作一次?使用单件模式。拥有一个静态实例,如果已经设置,则销毁新实例。。参见例如,ist是用一个小的
s
…Speedy@derHugo编写的。我还没来得及把答案贴出来就把那该死的评论拿出来了哈哈。因为你和我在同一时间得到了完全相同的答案。我希望有一种方法可以将代表与you@whathm哈哈,事实上第一次是在一个小时前:P别担心。。这个社区不是关于代表,而是帮助他人学习的人;)