10

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

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

4

5 回答 5

20

它可以是几件事,无论您是使用OnTriggerEnter还是OnCollisionEnter

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

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

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

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

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

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

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

碰撞矩阵
资源

于 2017-05-12T14:55:33.157 回答
2

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

于 2018-06-01T13:02:49.903 回答
1

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

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

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

  1. 检查您是否为任一对象检查了 istrigger 并确保它未选中。
  2. 检查并确保两者上的刚体都是非运动的。
于 2017-05-12T14:57:28.480 回答
1

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

于 2017-05-13T22:16:00.107 回答
0

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

  1. 所有游戏对象都应包含附加的碰撞器,并且玩家游戏对象应包含其中的刚体组件。
  2. 碰撞器大小应更改为组件的宽度和高度,而不是默认的 (1,1) 值。

在此处输入图像描述

于 2021-11-13T16:49:01.967 回答