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.