将枚举的存在与其特定内容分开
本文关键字:枚举 存在 | 更新日期: 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
等的键