碰撞检测在Unity中无法工作

11

首先,我知道这个问题已经被问了很多次,但我找不到解决方法,所以我的问题是,我正在制作一个教育游戏,我有一根静脉和血流(带有许多盒子碰撞器),还有一个单独的血细胞(也带有一个盒子碰撞器)。然而,我希望当细胞到达墙壁碰撞器时被销毁,但它并没有被销毁,它只是停留在那里。这是项目!

http://tinypic.com/r/10706es/9

我想销毁细胞的碰撞器是粉色的碰撞器,但当它接触它时,什么都没有发生,这是我的脚本。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class collision : MonoBehaviour {
    // Use this for initialization
    void Start () {
    }

    // Update is called once per frame
    void OnCollisionEnter(Collision col)
    {
        print("hihi");
        if (col.gameObject.tag == "Collider")
        {
            Destroy(gameObject);
        }
    }
}

此外,这是AddForce脚本。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AddForce : MonoBehaviour {

    public float thrust;
    public Rigidbody rb;
    private Vector3 up;
    private bool move;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
        up = new Vector3(0, 1, 0);
        move = false;
    }

    void FixedUpdate()
    {
        if (Input.GetKey("space"))
        {
            if (rb.velocity.magnitude < 5)
                rb.AddForce(up * thrust);
            move = true;
        }

        else
        {
            if (move == true)
                rb.velocity = new Vector3(0, -0.5F, 0);
        }


    }
}

谢谢你们的帮助!:D


你是如何移动这个物体的?看起来这是在你的Addforce脚本中。请发布那段代码。 - Programmer
你确定你的物体被标记为“Collider”了吗? - Daahrien
百分之百确定,但被标记为“碰撞器(collider)”的不是实际目标本身,而是该目标具有一个立方体子对象,该子对象具有盒状碰撞器(box collider)和“碰撞器(Collider)”标签,这可能是问题所在吗?此外,我添加了“添加力(add force)”脚本。 - user145708
5个回答

27

这可能是几件事情,无论你使用OnTriggerEnter还是OnCollisionEnter

  • 缺少刚体(最常见)。涉及到的游戏对象中至少需要有一个刚体(检查它们中是否至少有一个附加了刚体,如果您使用OnCollisionEnter,请确保未选中“Is Kinematic”)。有关更多信息,请参见下面的碰撞矩阵。

  • 缺少标签。碰撞的游戏对象没有“Collider”标签(尝试删除if语句进行测试)(要比较标签,请使用collider.gameObject.CompareTag("Collider"),它具有更好的性能)

  • 无法检测到的碰撞。物理层碰撞矩阵设置为不检测对象所在层之间的碰撞(进入编辑>项目>物理,并检查两个游戏对象的层是否在层碰撞矩阵内被选中)

  • 碰撞器配置错误。其中一个或两个游戏对象具有小/位置错误或缺失的碰撞器(检查它们是否都有碰撞器组件以及它们的大小是否正确)

如果正常工作,则应该能够按播放按钮并将一个游戏对象拖到另一个游戏对象中,然后您的Debug.Log将出现。

作为建议,使用更好地描述将成为其一部分的GameObject组的标记名称,例如"RedCells"或"WhiteCells"。这样,配置层碰撞矩阵和提高游戏性能将变得更容易。
另一个建议:对于仅销毁另一个GameObject的碰撞器(不反应,例如碰撞或实际碰撞),我使用触发器。这样,它们之间的碰撞不会改变任何剩余的GameObject中的任何内容(例如方向/速度等)。为此,请在Collider中检查Is Trigger并使用OnTriggerEnter而不是OnCollisionEnter。 碰撞矩阵 来源

我已经检查了前两个,红色单元格上有一个碰撞器,但是墙上没有,但是墙的父级(即静脉)有一个刚体,而且标签在子墙上而不是静脉上,这可能是问题吗?如果是,那么当它撞到特定的粉色碰撞器时,我该如何使对象消失? - user145708
如果红色细胞在墙的父级碰撞器内部,CollisionEnter事件将永远不会发生。如果您想检测红色细胞和墙之间的碰撞,则红色细胞和每个墙都需要具有Collider。Rigidbody可以在红色细胞中或在每个墙中或两者都有。如果没有GameObject实际上会与其发生碰撞,则静脉可能不需要碰撞器。像这样思考:每个发生碰撞的GameObject都需要一个碰撞器和潜在的Rigidbody。碰撞器告诉物理引擎如何处理该对象的碰撞。 - Kleber

2

有时您会向游戏对象添加 Nav Mesh Agent 组件(用于在策略游戏中进行自动路由操作等)。 在这种情况下,该游戏对象不参与碰撞检测。 因此,如果您确实需要这个 Nav Mesh Agent,则应将 Nav Mesh Obstacle 添加到其他固定的游戏对象,并将 Nav Mesh Agent 添加到其他可移动的游戏对象中。


1
我有几个后续问题,可能会导致解决方案。
首先,持有你的“collision”脚本的对象是否有刚体和碰撞器? 其次,墙壁是否同时具有刚体和碰撞器?
通常情况下,如果满足这些条件,则碰撞将起作用。 还有一些可能是问题的事情:
1. 检查你是否已经为任一对象选中了istrigger,并确保取消选中。 2. 检查并确保两者上的刚体都是非动力学的。

持有碰撞的物体(在这种情况下为红色细胞)脚本具有刚体,而墙壁只有一个碰撞器,但是墙壁的父级(即静脉)具有刚体。 - user145708
您不能使用对象的父级。它必须是具有碰撞体的相同对象,才能拥有刚体。至于红色细胞,则需要一个碰撞体。需要两个碰撞体和至少一个刚体。 - Nick Crow

1

我终于解决了它,我不确定这是否是问题的原因,但我刚刚从墙的父级中移除了刚体,然后它开始工作!我不知道刚体做了什么,但仅仅这样问题就解决了,谢谢大家的帮助! :D


0

请确保您的代码考虑了以下事项:

  1. 所有游戏对象都应该附带碰撞体,而玩家游戏对象应该包含刚体组件。
  2. 碰撞体大小应该根据组件的宽度和高度进行更改,而不是默认的(1,1)值。

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接