我对这可能是一件非常愚蠢的事情感到有些困难。我有一个敌人的游戏对象,这取决于它被击中的位置(碰撞)——要么是它,要么是游戏死亡。我认为描述这一点的最简单方法是以经典的《超级马里奥兄弟》游戏为例。
众所周知,如果玩家撞到敌人 - 玩家将失败 - 除非他跳到敌人的头顶上,在这种情况下敌人应该死。
我最初的想法是在游戏对象上创建两个对撞机:
- 蓝色边框代表 BoxCollider2D - 如果与 - 发生碰撞 - 将导致玩家输掉(注意它从顶部稍低)
- 绿色边框代表子游戏对象上的 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 模式的解决方案(虽然可能比我的问题所需要的更复杂)。
多谢你们。