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)
    {
        // ..
    }
}

soundeeffect . play()抛出NullReferenceException,即使声音已经加载

错误信息说明了一切。在调用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();
    }
}