soundeeffect . play()抛出NullReferenceException,即使声音已经加载
本文关键字:声音 加载 play 抛出 NullReferenceException soundeeffect | 更新日期: 2023-09-27 18:03:24
好吧,我有一个非常奇怪的问题。我现在正在用c#/MonoGame (Linux)编写一款简单的游戏。我在试着玩SoundEffect
。当我调用Play()
时(即使它已经在LoadContent()
方法中正确加载)。它抛出了一个带有Object Reference not set to an instance of an object
消息的NullReferenceException
。
下面是代码的结构
public class MyGame : Game
{
// ..
private SoundEffect _sfx;
public PingGame ()
{
// ...
}
protected override void Initialize ()
{
// ...
}
protected override void LoadContent ()
{
// ...
// No errors here on loading it
_sfx = Content.Load<SoundEffect>("noise.wav");
}
protected override void Update (GameTime gameTime)
{
// ...
if (playSound)
{
// This is where the error is thrown
_sfx.Play();
}
// ...
}
protected override void Draw (GameTime gameTime)
{
// ..
}
}
错误信息说明了一切。在调用Update (GameTime gameTime)
时,对象_sfx
还没有初始化。
你不可能知道你想要如何设计你的游戏,但你可以通过修改代码测试这一点,你将不会有空引用异常了。这可能不是你想要的代码设计方式,但它可以让你知道哪里出了问题以及如何修复它。
protected override void Update (GameTime gameTime)
{
// ...
if (playSound)
{
// This is where the error is thrown
// THIS ENSURES WHEN THIS METHOD IS INVOKED _sfx is initialized.
_sfx = Content.Load<SoundEffect>("noise.wav");
if(_sfx != null){
_sfx.Play();
}
}
// ...
}
我的猜测是(因为你没有包含代码):
-
GraphicsDeviceManager
不是在构造函数内部创建的(需要在base.Initialize()被调用之前创建) - 或者您忘记在
Initialize
方法中调用base.Initialize()
方法。
protected override void Update(GameTime gameTime)
{
// ...
if (playSound)
{
if (_sfx == null)
{
Content.Load<SoundEffect>("noise.wav");
}
_sfx.Play();
}
}