【问题标题】:Collision detection not working unity碰撞检测不能正常工作
【发布时间】:2017-05-12 13:38:21
【问题描述】:

首先,我知道这个问题被问了很多,但我找不到解决方案,所以我的问题是,我在做一个教育游戏,我有静脉和血流(有很多盒子碰撞器)和一个血细胞(也有一个盒子对撞机)但是我希望细胞在到达墙壁对撞机时被破坏,但它不只是停留在那里,这是项目!

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 脚本中。请发布该代码。
  • 你确定你的对象被标记为“对撞机”吗?
  • 100% 肯定,但是它不是标记为“collider”的对象,而是该对象有一个立方体子对象,并且该子对象具有盒子对撞机和“对撞机”标签,可以吗?问题?另外,我添加了“添加力”脚本

标签: c# unity3d collider


【解决方案1】:

可以是几件事情,无论你使用的是OnTriggerEnter 还是OnCollisionEnter

  • 缺少刚体(最常见的)。至少其中一个涉及的 GameObjects 需要有一个 RigidBody。 (检查其中是否至少有一个附加了 RigidBody,如果您使用的是OnCollisionEnter,则没有选中“Is Kinematic”)。有关详细信息,请参阅下面的碰撞矩阵。

  • 缺少标签。碰撞产生的游戏对象没有“碰撞器”标签(尝试去掉if语句测试一下)(比较标签,使用collider.gameObject.CompareTag("Collider"),它有更好的性能)

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

  • 碰撞器配置错误。一个或两个 GameObjects 有一个小/错误放置或缺少 Collider(检查它们是否都有 Collider 组件以及它们的大小是否正确)

如果它工作正常,您应该可以按下播放键并将一个 GameObject 拖到另一个 GameObject 中,然后您的 Debug.Log 就会出现。

作为建议,使用能够更好地描述将成为其中一部分的游戏对象组的标签名称,例如“RedCells”或“WhiteCells”。配置层碰撞矩阵并提高游戏性能会更容易。

另一个建议:对于只会破坏另一个游戏对象的碰撞器(不要做出反应,例如碰撞或实际碰撞),我使用触发器。这样,它们之间的碰撞不会改变剩余游戏对象中的任何内容(如方向/速度/等)。为此,请检查 Collider 中的 Is Trigger 并使用 OnTriggerEnter 而不是 OnCollisionEnter。


Source

【讨论】:

  • 我已经检查了前 2 个,红细胞上有一个对撞机,但是墙没有,但是墙的父级(即静脉)也有一个刚体标签在孩子的墙上而不是在静脉上,这可能是问题吗?如果是这样,当那个特定的粉色对撞机崩溃时,我怎样才能让对象消失?
  • 如果 Red Cell 位于 Wall 父级的碰撞器内,则永远不会发生 CollisionEnter 事件。如果要检测 Red Cell 和 Wall 之间的碰撞,Red Cell 和每个 Wall 都需要有一个 Collider。刚体可以在红细胞或每个墙或两者中。如果没有游戏对象实际与静脉发生碰撞,则静脉可能不需要碰撞器。像这样想:每个碰撞的游戏对象都需要一个碰撞器,并且可能需要一个刚体。对撞机单独告诉物理学该物体的期望。
【解决方案2】:

有时您将 Nav Mesh Agent 组件添加到您的游戏对象(以在战略游戏中自动路由操作......)。 在这种情况下,这个游戏对象不参与对撞机。 所以,如果你真的需要这个Nav Mesh Agent,你应该将Nav Mesh Obstacle添加到其他固定的游戏对象,同时添加Nav Mesh Agent到其他可移动的游戏对象。

【讨论】:

    【解决方案3】:

    我有一些后续问题可能会导致解决方案。

    首先,持有“碰撞”脚本的对象是否有刚体和对撞机? 其次,墙是否既有刚体又有碰撞体?

    通常,如果满足这些条件,那么碰撞就会起作用。 其他一些可能是问题的事情:

    1. 检查是否为任一对象检查了 itrigger,并确保未选中。
    2. 检查并确保两者上的刚体都是非运动的。

    【讨论】:

    • 持有碰撞的对象(在本例中为红色单元格)脚本有一个刚体,而墙只有一个碰撞器,但是墙的父级(即静脉)有一个刚体
    • 不能使用对象的父对象。它必须与具有对撞机的具有刚体的对象相同。至于红细胞,它需要一个对撞机。需要有 2 个对撞机和至少一个刚体。
    【解决方案4】:

    我终于修好了,我真的不知道这是否是问题所在,但我刚刚从墙的父级移除了刚体,它开始工作了!,我不知道刚体做了什么,但就是这样问题已解决,谢谢大家的帮助! :D

    【讨论】:

      【解决方案5】:

      确保在您的代码中考虑以下事项,

      1. 所有游戏对象都应包含 collider 附加和玩家 游戏对象应包含 rigidbody 组件。
      2. 碰撞体大小应该改变为宽度和高度 组件而不是默认 (1,1) 值。

      【讨论】:

        猜你喜欢
        • 2011-07-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多