Unity3d 多对撞机的推荐方法

Unity3d 多对撞机的推荐方法,unity3d,unity3d-2dtools,Unity3d,Unity3d 2dtools,我对一件可能很愚蠢的事情有些困难。我有一个敌人的游戏对象,这取决于它被击中(碰撞)的位置——要么是它,要么游戏死亡。我认为最简单的描述方法是以经典的超级马里奥兄弟游戏为例 大家都知道,如果玩家遇到敌人-玩家将失败-除非他跳到敌人的头顶,在这种情况下,敌人应该死亡 我最初的想法是在游戏对象上创建两个碰撞器: 蓝色边框表示一个BoxCollizedR2D,如果与之碰撞,将导致玩家失败(请注意,它比顶部稍低) 绿色边框表示子游戏对象上的BoxCollizedR2D,如果与之碰撞,将导致游戏对象死亡

我对一件可能很愚蠢的事情有些困难。我有一个敌人的游戏对象,这取决于它被击中(碰撞)的位置——要么是它,要么游戏死亡。我认为最简单的描述方法是以经典的超级马里奥兄弟游戏为例

大家都知道,如果玩家遇到敌人-玩家将失败-除非他跳到敌人的头顶,在这种情况下,敌人应该死亡

我最初的想法是在游戏对象上创建两个碰撞器:

  • 蓝色边框表示一个BoxCollizedR2D,如果与之碰撞,将导致玩家失败(请注意,它比顶部稍低)
  • 绿色边框表示子游戏对象上的BoxCollizedR2D,如果与之碰撞,将导致游戏对象死亡
  • 以下是我使用的代码的简化版本:

        // Collider #1
        public void OnCollisionEnter2D(Collision2D collision)
        {
            // Trigger 'Game-Over' logic
        }
    
        // Collider #2
        public void OnCollisionEnter2D(Collision2D collision)
        {
            if (collision.gameObject.tag == "Player")
            {
                Destroy(this.gameObject);
            }
        }
    
    然而,在与对撞机1碰撞后的瞬间,对撞机2也会触发——当敌人被摧毁时,玩家也会输

    我一直在使用RigidBody2D值,以防止玩家在从顶部击中敌人时进入第二台对撞机-但显然,使用该力/速度,对撞机可能有点不准确(或者可能我只是做错了?)

    我已经研究了光线投射,但这似乎太复杂了,不适合我看来相当琐碎的东西(在播放器的所有四条边和四个顶点上投射光线-假设播放器有一个长方体碰撞器)

    “目前”我所使用的是一个单一的对撞机,带有一段我不满意的简单代码,但并不总是有效:

        public void OnCollisionEnter2D(Collision2D collision)
        {
            if (collision.gameObject.tag == "Player")
            {
                float yVelocity = collision.gameObject.transform.rigidbody2D.velocity.y;
    
                if (yVelocity < 0)
                {
                    Debug.Log("Enemy will lose..." + yVelocity);
    
                    Destroy(this.gameObject);
                }
                else
                {
                    // Trigger 'Game-Over' logic
                }
            }
        }
    
    公共空间OnCollisionInter2D(Collision2D碰撞)
    {
    如果(collision.gameObject.tag==“Player”)
    {
    float yVelocity=collision.gameObject.transform.rigiidbody2d.velocity.y;
    if(yVelocity<0)
    {
    调试日志(“敌人将失去…”+yVelocity);
    摧毁(这个游戏对象);
    }
    其他的
    {
    //触发“游戏结束”逻辑
    }
    }
    }
    
    我目前在2D模式下工作,但3D模式的解决方案(可能比我的问题所需的更复杂)也会被考虑


    谢谢大家。

    作为一名游戏开发者,你总是有很多方法来解决问题或进行游戏。 首先我要说的是,你应该为你的对象和角色制作一个二维多边形碰撞器。只是碰撞图片不是很好,因为我看到你们在游戏中使用了方块滑环

    一个很好的选择是,你附加并清空玩家的对象,并设置其在玩家脚下的位置,并检查敌人的命中情况,否则如果敌人击中主角对象,玩家就会死亡

    另一个选择是当o对象碰撞时检查2个对象的y位置。玩家的死亡人数越高,否则敌人会杀死玩家

    如果你想得更多,你会找到更多的答案。
    你必须检查不同的方法并找到最有效的方法。

    我认为当一个对撞机被触发时,禁用另一个对撞机是很容易的。您可以使用
    collider.enabled=true轻松启用/禁用碰撞器
    collider.enabled=false

    // Collider #1
    public void OnCollisionEnter2D(Collision2D collision)
    {
        // Trigger 'Game-Over' logic
        // collider2.enabled = false;
    }
    
    // Collider #2
    public void OnCollisionEnter2D(Collision2D collision)
    {
        // collider1.enabled = false;
        if (collision.gameObject.tag == "Player")
        {
            Destroy(this.gameObject);
        }
    }
    

    这样,它将非常轻量级,并且易于实现

    实现所需功能的一种方法是将每个碰撞器放在其子游戏对象中,并使用iStoching()方法

    void OnTriggerInter2d(碰撞的R2D其他){
    if(GameObject.Find(“顶部触发器”).GetComponent().IsTouching(其他)){
    销毁(transform.gameObject)
    }
    if(GameObject.Find(“底部触发器”).GetComponent().IsTouching(其他)){
    销毁(其他游戏对象)
    }
    }
    
    嗨!你可以只做
    Destroy(游戏对象)如果你想毁掉自己。:)@Bobthezealot-我绝对不想毁掉自己:)我想要的是一个对撞机触发,而另一个不会触发。在命中来自顶部的情况下,两个碰撞器都被触发-即使我正在尝试销毁游戏对象。不,对不起,我的意思是你可以替换
    destroy(this.gameobject)
    销毁(游戏对象)
    @ZuiqPazu您是否在寻找一个哲学上的答案或可能的实现?不管怎样,我补充了一个答案,这就是你想要的吗?哦,好的,谢谢你的提示:)谢谢你的解释。我知道通常BoxCollidater2D是不够的,而且看起来也不好看,但是因为我的图像基本上都是盒子,所以我认为我可以使用盒子。您提到了在碰撞时检查对象的Y位置,但我在上面粘贴的最后一个代码示例中已经尝试过了。它并不总是有效的。有时,这个值相当奇怪,会触发敌人死亡——很明显,游戏中遇到了这个值。我认为这与物理有关?另外,将游戏物体连接到玩家的脚上与将游戏物体连接到敌人的头上似乎没有什么不同。不过,我会结合@Dinal24的建议尝试一下,看看结果如何。我会让你知道的。正如我对另一个答案的评论,虽然你的答案本身并不能真正解决问题,但两个答案的组合(并将其中一个碰撞器设置为触发器,似乎确实有助于解决问题)。我会接受你提出不同选择的答案。谢谢。你说“我已经试过[检查对象的Y位置]”,但你最初的问题显示你只检查玩家对象的Y速度。我只是想澄清一下,我正在研究一个可能的实现,你的实现就足够了。然而,我不知道这与我当前的实现有多大不同,但我还是会尝试一下。我刚刚尝试了你提到的方法,还有@virtuoso建议在
    void OnTriggerEnter2D(Collider2D other){
        if(GameObject.Find("Top Trigger").GetComponent<BoxCollider2D>().IsTouching(other)){
            Destroy(transform.gameObject)
        }
        if(GameObject.Find("Bottom Trigger").GetComponent<BoxCollider2D>().IsTouching(other)){
            Destroy(other.gameObject)
        }
    }