将枚举的存在与其特定内容分开

本文关键字:枚举 存在 | 更新日期: 2023-09-27 18:08:29

我正在为游戏引擎编写音频管理器,我希望保持它的通用性,以便不同的游戏可以使用相同的引擎。现在我使用Dictionary<string,SoundEffect>来存储声音和与之相关的事件。我更愿意使用Enum作为密钥,因为它将带来许多好处。现在,有人负责AddSound("Explosion", explosionSound),我们团队的另一个程序员负责PlaySound("ExplosionSpelledWrong"),等等。

我希望音频管理器引用一个"SoundEvent"enum。我的问题是,这个枚举的内容将是特定于游戏的。有些游戏可能有:

enum SoundEvent {    
    Explosion,
    GameOver
}

另一个可能有

enum SoundEvent {    
    Jump,
    Laser
 }

等等

请注意,我不需要在音频管理器中引用枚举的内容,因为它只是字典中的一个键—-特定的SoundEvent总是会在特定的游戏项目中指定。

那么我该如何将引擎与特定游戏项目区分开来呢?我不想在音频管理器中引用任何特定于游戏的内容。

我想到的第一件事就是制作一个namespace GameSpecificEnums,尽管如此,它仍然是引擎项目的一部分,并把它们放在那里。然而,如果要制作不同的游戏,就必须改变引擎项目的这一部分。这在现实中并不是什么大事,但它并不合适。

我的另一个想法是将Dictionary更改为Dictionary<int,SoundEffect>,然后在游戏特定代码中有这样的东西:

static class SoundEvent {
    private const int Explosion = 0;
    private const int Laser     = 1;
    // etc.
}

然后调用音频管理器,比如:

AudioManager.Add(SoundEvent.Explosion, explosionSound);

但这感觉也不对,因为有人可以AudioManager.PlaySound(2112)

有其他解决方案吗?

将枚举的存在与其特定内容分开

听起来您可能希望在键类型中使AudioManager泛型。您可以在没有任何限制的情况下这样做,或者您可以尝试将其约束为枚举。这在"普通"c#中是不可行的,但我有一个名为Unconstrained Melody的项目,它通过IL重写完成了这一点。这可能有点矫枉过正——你可以将键类型限制为struct,并期望每个人都能正确使用它。

那么你的PlaySound方法将接受类型为TKey等的键