3

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

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

有对撞机的敌人

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

  1. 蓝色边框代表 BoxCollider2D - 如果与 - 发生碰撞 - 将导致玩家输掉(注意它从顶部稍低)
  2. 绿色边框代表子游戏对象上的 BoxCollider2D - 如果与之发生碰撞 - 将导致游戏对象死亡。

以下是我使用的代码的简化版本:

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

这种方法有效,但是在与Collider #1碰撞后的瞬间,Collider #2也会触发 - 当敌人被摧毁时,玩家也会失败。

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

我已经研究了 RayCast,但这对于我看起来相当微不足道的东西来说似乎太复杂了(在玩家的所有四个侧面和四个顶点上投射光线 - 假设玩家有一个盒子对撞机)。

我“暂时”使用的是一个单一的对撞机,里面有一段我不满意的简单代码,而且并不总是有效:

    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 模式的解决方案(虽然可能比我的问题所需要的更复杂)。

多谢你们。

4

3 回答 3

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

这样,它将非常轻巧且易于实现。

于 2015-02-17T02:37:04.193 回答
1

作为游戏开发者,您总是有很多方法来解决问题或制作游戏玩法。首先我不得不说你应该为你的对象和角色制作一个 2d 多边形对撞机。只是碰撞图片不是很好,因为我看到你在游戏中使用了 box cilliders。

一个不错的选择可能是您将对象附加并清空您的玩家并将其位置设置在您的玩家脚下并检查敌人是否击中敌人,否则如果敌人击中主角对象,玩家就会死亡。

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

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

于 2015-02-17T02:24:59.780 回答
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)
    }
}
于 2017-02-16T21:32:49.690 回答