我正在编写一个游戏引擎的音频管理器,我想保持它的通用性,以便不同的游戏可以使用相同的引擎。现在我使用Dictionary<string,SoundEffect>
来存储声音和它们相关的事件。我更愿意使用Enum
作为密钥,因为它会带来许多好处。现在,有人可以AddSound("Explosion", explosionSound)
和我们团队中的另一位程序员PlaySound("ExplosionSpelledWrong")
等等。
我希望音频管理器引用“SoundEvent”enum
。我的问题是这个枚举的内容将是游戏特定的。有些游戏可能有:
enum SoundEvent {
Explosion,
GameOver
}
另一个可能有
enum SoundEvent {
Jump,
Laser
}
等等。
请注意,我不需要在音频管理器中引用枚举的内容,因为它只是字典中的一个键 - 特定的SoundEvent将始终在游戏特定的项目中指定
那么如何将我的引擎与游戏特定项目分开?我不想在音频管理器中引用任何特定于游戏的内容。
我想到的第一件事就是制作一个namespace GameSpecificEnums
,它仍然是Engine项目的一部分并将它们放在那里。但是,为了制作不同的游戏,人们必须改变引擎项目的这一部分。在现实中这不是什么大问题,但它并不合适。
我的另一个想法是将词典更改为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)
还有其他解决方案吗?
答案 0 :(得分:2)
听起来你可能希望在密钥类型中使AudioManager
通用。您可以不受任何限制地执行此操作,或者您可以尝试将其约束为枚举。对于“普通”C#,这是不可行的,但我有一个名为Unconstrained Melody的项目,它通过IL重写完成它。这可能是一种矫枉过正 - 你总是可以将密钥类型约束为struct
,并希望每个人都能正确使用它。
然后,您的PlaySound
方法会使用TKey
等类型的密钥。