我对这可能是一件非常愚蠢的事情感到有些困难。我有一个敌人的游戏对象,根据它被击中的位置(碰撞) - 要么它,要么游戏死亡。我认为描述这一点的最简单方法是以经典的 super 马里奥兄弟游戏为例。
众所周知,如果玩家遇到敌人 - 玩家就会失败 - 除非他跳到敌人的头顶上,在这种情况下敌人应该死。
我最初的想法是在游戏对象上创建两个碰撞器:
- 蓝色边框代表 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 值来防止玩家在从顶部击中敌人时进入第二个对撞机 - 但显然在这种力量/速度下,对撞机可能会稍微不准确(或者也许我只是在做错了吗?)。
我研究过 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 模式的解决方案(虽然可能比我的问题所需的更复杂)。
谢谢大家。
最佳答案
作为游戏开发者,您总是有多种方法来解决问题或制作游戏玩法。 首先我不得不说你应该为你的对象和角色制作一个 2d 多边形碰撞器。仅仅碰撞图片不太好,因为我看到你在游戏中使用了 box cilliders。
一个好的选择是,你可以附加并清空玩家的物体,并将其位置设置在你的玩家脚下,并检查敌人击中敌人是否死亡,否则如果敌人击中主要角色物体,玩家就会死亡。
另一种选择是当 o 个物体发生碰撞时检查 2 个物体的 y 位置。玩家被杀的次数越高,否则敌人就会杀死玩家。
如果你想得更多,你就会找到更多答案。 您必须检查不同的方法并找到最有效的方法。
关于unity-game-engine - 多个碰撞器的推荐方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28552155/