我有一个带有以下代码的源音频:
public class Sound : MonoBehaviour {
Static Sound instance;
void Awake()
{
if (instance != null)
{
Destroy(gameObject);
}
else
{
instance = this;
DontDestroyOnLoad(gameObject);
}
}
因此,当我更改场景时,音频再次开始播放。如何将其限制为只有 1?
编辑:我该如何解决这个问题? 我收到此错误 1 - 类、结构或接口成员声明中意外的符号instance' in class, struct, or interface member declaration 2 - Unexpected symbol
;'
选项 1:
当涉及到这样的事情时,单例模式可能是你的最佳选择。单例模式的目的是将类限制为仅自身的一个实例。要了解有关该模式的更多信息,请参阅其上的 Wiki。
看起来您已经在这样做(在第一次编辑之后(,但您要更改的是代码中Static
的大写。Static
和static
是两回事。为了你,你正在寻找static
.这应该可以解决您的问题/错误,并允许您正确使用单例模式。
选项 2:
此外,如果您想避免典型的单例模式,另一种选择是在所有游戏对象中搜索任何包含您Sound
类/组件的游戏对象。然后,如果场景中已经打开,则让尝试实例化的游戏对象自行销毁。您可以使用以下代码执行此操作:
public class Sound : MonoBehaviour
{
void Awake()
{
int numSoundInstances = FindObjectsOfType<Sound>().Length;
if (numSoundInstances > 1)
{
Destroy(this.gameObject);
}
else
{
DontDestroyOnLoad(this.gameObject);
}
}
}
在我看来,这比使用单例模式的效率要低得多。这是因为使用 FindObjectsOfType 会强制代码检查当前在游戏中的每个游戏对象。根据游戏中游戏对象的数量,这可能会对系统造成很大的负担。