Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 统一处理多个不同用途的对撞机_C#_Unity3d_Collision Detection - Fatal编程技术网

C# 统一处理多个不同用途的对撞机

C# 统一处理多个不同用途的对撞机,c#,unity3d,collision-detection,C#,Unity3d,Collision Detection,我的敌人有两个不同的对撞机。 第一个是盒子对撞机,它被用作敌人的打击盒 第二个是球体对撞机,我想用它来探测玩家和他的盟友。此碰撞器的属性IsTrigger设置为true(BoxCollider没有) 我的问题是,当我的玩家发射一个抛射物时,它首先击中球体对撞机。球体对撞机被视为一个打击箱,我的敌人受到伤害。 以下是投射脚本: void OnTriggerEnter (Collider col) { if (col.gameObject.tag == "Player") {

我的敌人有两个不同的对撞机。 第一个是盒子对撞机,它被用作敌人的打击盒

第二个是球体对撞机,我想用它来探测玩家和他的盟友。此碰撞器的属性IsTrigger设置为true(BoxCollider没有)

我的问题是,当我的玩家发射一个抛射物时,它首先击中球体对撞机。球体对撞机被视为一个打击箱,我的敌人受到伤害。 以下是投射脚本:

void OnTriggerEnter (Collider col)
{
    if (col.gameObject.tag == "Player")
    {
        AUnit a = col.gameObject.GetComponent<AUnit>();
        if (a != null)
        {
            a.takeDamage(damage);
            if (goThrough == false)
                Destroy(gameObject);
        }
    }
}
void ontriggenter(对撞机列)
{
如果(col.gameObject.tag==“玩家”)
{
AUnit a=col.gameObject.GetComponent();
如果(a!=null)
{
a、 损坏;
if(goThrough==false)
摧毁(游戏对象);
}
}
}

我的问题很简单,如何只检测BoxCollider而忽略SphereCollider?

这可以通过使用来实现

将玩家设置为一层,将玩家投射物设置为另一层

然后,您可以使两个层在碰撞检测中相互忽略。

这可以通过使用来实现

将玩家设置为一层,将玩家投射物设置为另一层

然后,您可以在碰撞检测中使两个层相互忽略。

如果您不希望它们基于层工作,因为在某些情况下,如果没有较大的解决方案,这将无法完全工作,您可以使用以下解决方案,该解决方案也应该工作良好

public class "ClassNameHere": MonoBehaviour
{
    public BoxCollider2D Collider1;
    public CircleCollider2D Collider2;
    public CircleCollider2D Collider3;

    private void OnCollisionEnter2D(Collision2D other)
    {
        if(other.collider==Collider1)
        {
          Debug.Log("1");
        }
        if(other.collider==Collider2)
        {
           Debug.Log("2");
        }
        if(other.collider==Collider3)
        {
           Debug.Log("3")
        }
    }
}
使用此选项,您将在与特定碰撞器碰撞时执行特定操作,即使它们位于同一游戏对象上

但是请注意,Collider没有id变量或类似的东西,它允许unity检测同一游戏对象上相同类型的Collider之间的差异。但只要对撞机是另一种类型,它就会工作


如果您希望在单个对象上使用2个相同类型的碰撞器,但仍然希望注意到差异,则很可能必须转到unity的该类型碰撞器的类定义,并添加公共int、float、long,或字符串ID,您可以在代码中获取该ID,以获取与之交互的特定类型的碰撞器。

如果您不希望它们基于层工作,因为在某些情况下,如果没有大型解决方案,这将无法完全工作,您可以使用以下解决方案,该解决方案也应该工作良好

public class "ClassNameHere": MonoBehaviour
{
    public BoxCollider2D Collider1;
    public CircleCollider2D Collider2;
    public CircleCollider2D Collider3;

    private void OnCollisionEnter2D(Collision2D other)
    {
        if(other.collider==Collider1)
        {
          Debug.Log("1");
        }
        if(other.collider==Collider2)
        {
           Debug.Log("2");
        }
        if(other.collider==Collider3)
        {
           Debug.Log("3")
        }
    }
}
使用此选项,您将在与特定碰撞器碰撞时执行特定操作,即使它们位于同一游戏对象上

但是请注意,Collider没有id变量或类似的东西,它允许unity检测同一游戏对象上相同类型的Collider之间的差异。但只要对撞机是另一种类型,它就会工作


如果您希望在单个对象上使用2个相同类型的碰撞器,但仍然希望注意到差异,则很可能必须转到unity的该类型碰撞器的类定义,并添加公共int、float、long,或字符串ID,您可以在代码中获取该ID,以获取与您交互的特定类型的碰撞器。

我同意基于层的碰撞,但请注意,您不希望播放器本身位于不同的层中,而只是它是SphereCollider,否则您的投射物将永远不会检测到BoxCollider触发伤害。添加一个空的子对象,将您的SpeRecolder及其逻辑放在玩家和弹道逻辑层之外的另一层中;)@完全正确。此外,添加一个空的子对象而不将其标记为父对象也是有效的。除非你想拥有友军火力,否则你实际上应该让友军炮弹忽略友军,而敌人的炮弹忽略了敌人。我同意基于层的碰撞,但注意到你不想让玩家自己在不同的层中,只是球对撞机,否则你的炮弹永远不会检测到BoxCollider触发伤害。添加一个空的子对象,将您的SpeRecolder及其逻辑放在玩家和弹道逻辑层之外的另一层中;)@完全正确。此外,添加一个空的子对象而不将其标记为父对象也是有效的。除非你想拥有友军火力,否则你实际上应该让友军炮弹忽略友军炮弹,而敌人炮弹忽略敌人炮弹。