C# 如何使此代码更易于管理,以防止音频冲突?

C# 如何使此代码更易于管理,以防止音频冲突?,c#,optimization,audio,refactoring,unity3d,C#,Optimization,Audio,Refactoring,Unity3d,我只是在寻找任何能让这段代码更好的建议。如果我以这种方式继续下去,将会产生大量的代码,我认为这是可以避免的,但我现在无法做到这一点。这将很快失去控制 public enum PhysicMaterialType { SoundFailure = 0, AsteroidBall, BalloonRubber } public void PlaySoundBasedOnCollision ( PhysicMaterialType phyMatA, PhysicMater

我只是在寻找任何能让这段代码更好的建议。如果我以这种方式继续下去,将会产生大量的代码,我认为这是可以避免的,但我现在无法做到这一点。这将很快失去控制

public enum PhysicMaterialType
{
    SoundFailure = 0,

    AsteroidBall,

    BalloonRubber
}

public void PlaySoundBasedOnCollision ( PhysicMaterialType phyMatA, PhysicMaterialType phyMatB )
{
    switch ( phyMatA )
    {
        case PhysicMaterialType.AsteroidBall:
            {
                CheckAsteroidBallCollision ( phyMatB );

                break;
            }
        case PhysicMaterialType.BalloonRubber:
            {
                CheckBalloonRubberCollision ( phyMatB );

                break;
            }
   }

}

void CheckAsteroidBallCollision ( PhysicMaterial phyMatB )
{
    switch ( phyMatB )

    {
        case PhysicMaterialType.AsteroidBall:
            {
                //Play AsteroidAsteroidBallSound

                break;
            }
        case PhysicMaterialType.BalloonRubber:

            {
                break;
            }
   }
}

如果你要有很多类型,不同类型的预期碰撞声音必须以多种方式来处理,考虑从你要实现的每种类型的物理材料派生类。在派生类中定义一个公共方法来处理确定要播放的声音-将第二个对象的类型传递给此方法。像这样:

class PhysicMaterial
{
   public virtual string GetCollisionSound (PhysicMaterialType targetType)
   {
       // define default behavior here, if derived class doesn't need to do anything special
   }
}

class AsteroidBall : PhysicMaterial
{
   public override string GetCollisionSound (PhysicMaterialType targetType)
   {
       ...
   }
}

class BalloonRubber: PhysicMaterial
{
   public override string GetCollisionSound (PhysicMaterialType targetType)
   {
       ...
   }
}

返回最适合您的场景的任何数据类型。

如果
phyMatA
是小行星球而
phymatab
是气球橡胶,您希望发生什么?(或反之亦然)只有当它们都是同一类型时,你才有声音播放吗?这只是一个简单的例子,我现在有大约15种材料,它们都可以相互碰撞,都可以播放声音。虽然如果你交换Phymatab击中phyMatA的顺序,它将播放与phyMatA击中Phymatab相同的声音。