【发布时间】:2016-08-08 22:20:26
【问题描述】:
我目前正在为游戏添加音效,虽然我当前的代码运行良好,但我正在寻找一种简化它的方法。 基本上,游戏中的每个物体都有一个字符串值表示其材质(即“木头”、“金属”等),当两个物体碰撞时,会根据组合播放声音效果。代码基本上是这样的:
if( (matA == "metal" && matB == "wood") || (matA == "wood" && matB == "metal") )
{
//play sound for metal-wood collision
}
但我想知道是否有办法将 if 语句简化为以下内容:
if( one of the materials is wood && one of the materials is metal )
{
//play sound for metal-wood collision
}
【问题讨论】:
-
是出于性能原因还是“更好看的代码”需要简化?如果第一个为真,您可以为每种材料分配一个质数而不是字符串(可能使用宏/枚举)并检查两种碰撞材料的乘积。这样,两种材料的每种组合都有一个唯一编号。
-
您可以执行
if (new HashSet<string> { matA, matB, }.SetEquals(new HashSet<string> { "metal", "wood", }))之类的操作,但运行速度会比您所拥有的要慢。你实际上只需要.IsSupersetOf,但这对于代码的读者来说可能不太明显,而且我认为HashSet<>有优化,这意味着你不会从使用.IsSupersetOf中获得太多的性能。无论如何,如果您有两个以上的变量,这将开始变得更有意义。有两个变量,坚持你所拥有的,或者从韦斯顿的回答中考虑好的语法。 -
@phil13131 你刚刚推荐了一个素数分解来识别唯一的标志吗?这是一个令人愉快的创造性解决方案,但为它们每个分配 2 的幂,并且仅使用标准但操作方法肯定会更直观和惯用
-
@phil13131 简化是为了让代码看起来更漂亮。我觉得必须有一种更简洁的方法来检查材料的组合,而不用担心出现的顺序或有一个容易出现拼写错误或被遗忘的组合的 if-else 语句墙。
-
@SteveCox 我同意,但是,我提出了这个建议,因为这只会为您留下 32 种可能的 4 字节整数材料,我想可能会出现需要更多的情况(甚至超过 64长期)。但如果可能的话,位图当然是一种更快、更清洁的解决方案。
标签: c# if-statement unity3d