【发布时间】:2015-02-16 23:28:20
【问题描述】:
我对这可能是一件非常愚蠢的事情感到有些困难。我有一个敌人的游戏对象,取决于它被击中的位置(碰撞)——要么是它,要么是游戏死亡。我认为描述这一点的最简单方法是以经典的超级马里奥兄弟游戏为例。
众所周知,如果玩家撞到敌人 - 玩家将失败 - 除非他跳到敌人的头顶上,在这种情况下敌人应该死。
我最初的想法是在游戏对象上创建两个碰撞器:
- 蓝色边框代表 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 模式的解决方案(虽然可能比我的问题所需要的更复杂)。
谢谢大家。
【问题讨论】:
-
嗨!如果你想摧毁自己,你可以做
Destroy(gameObject);。 :) -
@Bobthezealot - 我绝对不想毁了自己 :) 我想要的是触发其中一个对撞机,而另一个不触发。在从顶部击中的情况下,两个对撞机都被触发 - 即使我试图摧毁游戏对象。
-
不,抱歉,我的意思是您可以将
Destroy(this.gameObject);替换为Destroy(gameObject);。 -
@ZuiqPazu 您是否在寻找哲学答案或可能的实现?无论如何,我添加了一个答案,是你要找的吗?
-
哦,好的,谢谢你的提示 :)