C# 阅读我的答案,你就会知道我已经提供了这些信息。使用4字节整数可以使用大约6550种材质。已经表示他想要“碰撞”材料,所以可以公平地假设他只是指2@nhgrif的组合,目前不在这个问题的范围之内。首先,您必须定义多材质碰撞应该是什么样子,以及为什么它听起来应
C# 阅读我的答案,你就会知道我已经提供了这些信息。使用4字节整数可以使用大约6550种材质。已经表示他想要“碰撞”材料,所以可以公平地假设他只是指2@nhgrif的组合,目前不在这个问题的范围之内。首先,您必须定义多材质碰撞应该是什么样子,以及为什么它听起来应,c#,if-statement,unity3d,C#,If Statement,Unity3d,阅读我的答案,你就会知道我已经提供了这些信息。使用4字节整数可以使用大约6550种材质。已经表示他想要“碰撞”材料,所以可以公平地假设他只是指2@nhgrif的组合,目前不在这个问题的范围之内。首先,您必须定义多材质碰撞应该是什么样子,以及为什么它听起来应该不同于三对独立碰撞。无论如何,基于这个问题,只有两种材料是一个安全的假设,这是一个不错的解决方案,尽管有点模糊。应该针对使用字典进行分析/基准测试,如果性能至关重要,则选择更快的字典-对于游戏/物理引擎来说可能是这样。这是一个好主意,只需明确
阅读我的答案,你就会知道我已经提供了这些信息。使用4字节整数可以使用大约6550种材质。已经表示他想要“碰撞”材料,所以可以公平地假设他只是指2@nhgrif的组合,目前不在这个问题的范围之内。首先,您必须定义多材质碰撞应该是什么样子,以及为什么它听起来应该不同于三对独立碰撞。无论如何,基于这个问题,只有两种材料是一个安全的假设,这是一个不错的解决方案,尽管有点模糊。应该针对使用字典进行分析/基准测试,如果性能至关重要,则选择更快的字典-对于游戏/物理引擎来说可能是这样。这是一个好主意,只需明确字典必须设置一次并重复使用。事实上,OP似乎会在检查字典之前这样做。我想指出的是]Enum属性,它是为这种用途而设计的,避免了一堆if-else语句听起来很不错,所以我一定会尝试一下。谢谢:)指出如果你要做
Material.Wood | Material.Iron
,枚举值应该是2的幂:Wood=1,Iron=2,Wool=4,Glass=8,…
@weston感谢你的关注和注意。我编辑了这篇文章,请您再次访问并给出您的想法。WoodMetal
可以定义为WoodMetal=Wood^Metal
或WoodMetal=Wood | Metal
(我更喜欢)您选择的^
而不是
。它也可能导致问题,例如:WoodMetal^Wood==Metal
,和Metal
,WoodMetal | Wood==WoodMetal
如果你想这样做,前者是可以的,但是当我们想要组合标志,而不是关闭它们时,
更有意义。@weston谢谢你的评论,我修复了代码。好的,但是你错过了第一点。行WoodMetal=3,//Wood | Metal的别名可以是:WoodMetal=Wood | Metal,
if( (matA == "metal" && matB == "wood") || (matA == "wood" && matB == "metal") )
{
//play sound for metal-wood collision
}
if( one of the materials is wood && one of the materials is metal )
{
//play sound for metal-wood collision
}
[Flags]
enum Material
{
Wood=1,
Iron=2,
Glass=4
//...
}
Dictionary<Material,SoundObject> sounds = new Dictionary<Material,SoundObject>();
sounds.add(Material.Wood,woodSound);
sounds.add(Material.Iron,ironSound);
sounds.add(Material.Wood | Material.Iron,woodAndIronSound);
// And play corresponding sound directly without any if statement.
sounds[object.Material].Play();
sounds[matA | matB].Play();
//If you want to try, just copy the code and see the result.
static Dictionary<char, short> myHashTable = Enumerable.Range((short)'A', (short)'z').ToDictionary((ch) => (char)ch, (sh) => (short)sh);
static void Main(string[] args)
{
System.Diagnostics.Stopwatch SW = new System.Diagnostics.Stopwatch();
short temp = 0;
SW.Start();
for(int i=0;i<10000000;i++)
temp = getValue('z');
SW.Stop();
Console.WriteLine(SW.ElapsedMilliseconds );
SW.Reset();
SW.Start();
for(int i =0;i<10000000;i++)
temp = myHashTable['a'];
SW.Stop();
Console.WriteLine(SW.ElapsedMilliseconds);
}
static short getValue(char input)
{
if (input == 'a')
return (short)'a';
else if (input == 'b')
return (short)'b';
else if (input == 'c')
return (short)'c';
else if (input == 'd')
return (short)'d';
else if (input == 'e')
return (short)'e';
else if (input == 'f')
return (short)'f';
else if (input == 'g')
return (short)'g';
else if (input == 'h')
return (short)'h';
else if (input == 'i')
return (short)'i';
else if (input == 'j')
return (short)'j';
else if (input == 'k')
return (short)'k';
else if (input == 'l')
return (short)'l';
else if (input == 'm')
return (short)'m';
else if (input == 'n')
return (short)'n';
else if (input == 'o')
return (short)'o';
else if (input == 'p')
return (short)'p';
else if (input == 'q')
return (short)'q';
else if (input == 'r')
return (short)'r';
else if (input == 's')
return (short)'s';
else if (input == 't')
return (short)'t';
else if (input == 'u')
return (short)'u';
else if (input == 'v')
return (short)'v';
else if (input == 'w')
return (short)'w';
else if (input == 'x')
return (short)'x';
else if (input == 'y')
return (short)'y';
else if (input == 'z')
return (short)'z';
return 0;
}
if (IsWoodAndMetal(matA, matB) || IsWoodAndMetal(matB, matA))
{
// play sound for metal-wood collision
}
public static bool IsWoodAndMetal(string matA, string matB)
{
return matA == "wood" && matB == "metal";
}
public static bool EitherParameterOrder<T>(Func<T, T, bool> func, T a, T b)
{
return func(a, b) || func(b, a);
}
if (EitherParameterOrder(IsWoodAndMetal, matA, matB))
{
// play sound for metal-wood collision
}
public static class Materials
{
public static uint Wood = 2,
public static uint Metal = 3,
public static uint Dirt = 5,
// etc...
}
if(matA*matB == Materials.Wood*Materials.Metal)
{
//play sound for metal-wood collision
}
//or with enums but annoying casts are necessary...
enum Materials:uint
{
Wood = 2,
Metal = 3,
Dirt = 5,
// etc...
}
if((uint)matA*(uint)matB == (uint)Materials.Wood*(uint)Materials.Metal)
{
//play sound for metal-wood collision
}
[Flags]
enum Materials {
Wood = 1,
Metal = 2,
Concrete = 4,
// etc ...
}
Meterials matA = Materials.Wood;
Meterials matB = Materials.Metal;
if ((matA | matB) == (Materials.Metal | Materials.Wood))
{
// Do something
}
[Flags]
enum Materials
{
Wood = 1,
Metal = 2,
WoodMetal = Wood | Metal,
Concrete = 4,
// etc
}
Materials matA = Materials.Wood;
Materials matB = Materials.Metal;
if ((matA | matB) == Materials.WoodMetal)
{
// Do something
}
public static bool MaterialsMatch(string candidate1, string candidate2,
string expected1, string expected2)
{
return (candidate1 == expected1 && candidate2 == expected2) ||
(candidate1 == expected2 && candidate2 == expected1);
}
if (MaterialsMatch(matA, matB, "wood", "metal"))
{
// play sound for wood-metal collision
}
else if (MaterialsMatch(matA, matB, "wood", "rubber"))
{
// play sound for wood-rubber collision
}
else if (MaterialsMatch(matA, matB, "metal", "rubber"))
{
// play sound for metal-rubber collision
}
// etc.