unity-game-engine - 多个碰撞器的推荐方法

标签 unity-game-engine unity3d-2dtools

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

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

enemy with colliders

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

  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 值来防止玩家在从顶部击中敌人时进入第二个对撞机 - 但显然在这种力量/速度下,对撞机可能会稍微不准确(或者也许我只是在做错了吗?)。

我研究过 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/

相关文章:

android - Unity 应用程序在前台崩溃并单击从同一应用程序创建的通知

android - Galaxy Phone S7 VR 都是直视下方,不会移动

unity-game-engine - Unity内置包编译器错误

javascript - 如何在Unity(5.6.0)中访问文本字段的值?

c# - UnityPhysics - 计算在指定距离处停止所需的减速度

unity-game-engine - 子对象的位置在育儿后发生变化

unity3d - 在 Unity (2D) 中连接具有不同纹理的 Rule-Tiles

c# - BoxCollider2D bounds.Contain(somePoint) 没有按预期工作

unity3d - 我如何创建一个 2D 'curve' 碰撞器

c# - 执行光线转换时 Camera.main 为空