推荐的多种对撞机方法

时间:2015-02-16 23:28:20

标签: unity3d unity3d-2dtools

我对可能是一件非常愚蠢的事情有些困难。我有一个敌人的游戏对象,取决于它被击中的位置(碰撞) - 无论是它还是游戏都死了。我认为最简单的方法是使用经典的 Super Mario Bros。游戏作为例子。

众所周知,如果玩家遇到敌人 - 玩家将会失败 - 除非他跳到敌人的头顶,在这种情况下敌人应该死亡。

enemy with colliders

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

  1. 蓝色边框代表BoxCollider2D - 如果与之相撞 - 将导致玩家输掉(注意它从顶部略低)
  2. 绿色边框表示儿童游戏对象上的BoxCollider2D - 如果与之相撞 - 将导致游戏对象死亡。
  3. 以下是我使用的代码的简化版本:

        // 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值,以防止玩家从顶部击中敌人时进入第二对手 - 但显然有力/速度,对手可能稍微不准确(或者我可能只是做这不对吗?)。

    我已经研究过RayCasts但是这看起来太复杂了,因为我看起来相当微不足道(在播放器的四个侧面和四个顶点上投射光线 - 假设玩家有一个盒子对撞机)。

    我现在所使用的是一个单一的对撞机,其中包含一段我不满意的简单代码,但并不总是有效:

        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
                }
            }
        }
    

    我目前正在2D模式下工作,但也会考虑3D模式的解决方案(虽然可能比我的问题更复杂)。

    谢谢你们。

3 个答案:

答案 0 :(得分:1)

作为游戏开发者,您总是有很多方法可以解决问题或制作游戏。 首先,我必须说你应该为对象和字符制作一个多边形对撞机2d。只是碰撞图片不是很好,因为我看到你在游戏中使用了盒子cilliders。

一个好的选择可以是你附加并清空你的玩家并在你的玩家脚下设置它的位置,并检查敌人是否在敌人击中主角对象时死亡,玩家死亡。

另一种选择可以是当o物体碰撞时检查2个物体的位置。玩家比他更高,其他敌人杀死了玩家。

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

答案 1 :(得分:1)

我认为在触发其他对撞机时很容易禁用其他对撞机。您可以使用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);
    }
}

这种方式非常轻巧,易于实现。

答案 2 :(得分:0)

实现所需内容的一种方法是将每个碰撞器放在其子游戏对象中并使用IsTouching()方法。

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)
    }
}