首页 > 解决方案 > 在 Unity 中无法检测到碰撞

问题描述

我是 Unity 的新手,正在努力获取该OnCollisionEnter功能。

我意识到这听起来与其他问题相似,但我仍然无法让它适用于我的情况。

我正在使用 Oculus 距离抓取示例场景。

我有一个障碍试图撞到一个足球;)

该块有一个盒子对撞机(非触发器)和刚体(非重力,非运动学)。

足球有一个 Sphere Collider(非触发器)和一个刚体(是重力,非运动学)。

该块包含一个脚本组件,使其漂浮到球上并撞到球上。

球有一个带有 OnCollisionEnter 函数的脚本,该函数应该在接触时破坏块。

这是Player附在球上的脚本。

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

public class Player : MonoBehaviour
{
    void OnCollisionEnter (Collision col) {
        FloatingItem item = col.collider.gameObject.GetComponent<FloatingItem>();
        Destroy(item);
    }
}

球在Player层中,块在Attacker层中。我在 Player Settings 碰撞矩阵中仔细检查了这些层之间是否启用了碰撞。

此外,每个对象的对撞机似乎是它们应该匹配网格的大小。

任何帮助碰撞工作都会很棒!

这也是设置的视觉效果:

在此处输入图像描述 在此处输入图像描述

更新:

这是浮动块的Update方法:

void FixedUpdate () {
      if(targetTransform != null) {
        this.transform.position = Vector3.MoveTowards(this.transform.position, targetTransform.transform.position, Time.deltaTime * moveSpeed);
      }
    }

我一直无法在控制台中显示任何调试日志,因此它们不可靠。但答案是碰撞实际上是有效的,但我破坏了错误的对象。

将其更改为Destroy(col.collider.gameObject)有效。在这里学到了一个重要的区别!谢谢!

更新 2:

我添加了如何OVRPlayerController设置的图像。试图阅读有关此character controller组件的弱文档,但我的理解是它包含一个胶囊对撞机。

在此处输入图像描述

标签: unity3doculus

解决方案


每当Rigidbody涉及到时,您都不设置

transform.position = Vector3.MoveTowards(...);

而是通过Rigidbody组件,例如使用MovePosition

Rigidbody.MovePosition移动 aRigidbody并符合插值设置。Rigidbody启用插值后,在Rigidbody.MovePosition帧之间创建平滑过渡。

这样可以在移动时保持物理完好无损,transform.position这会创建一个不会对碰撞做出反应的硬跳!

// If possible already reference this via the Inspector
[SerializeField] private Rigidbody _rigidbody;

public Rigidbody target;

private void Awake()
{
    if(!_rigidbody) _rigidbody = GetComponent<Rigidbody>();

    // Always when controlling your position by script the Rigidbody 
    // should be kinematic
    _rigidbody.isKinematic = true;
}

private void FixedUpdate ()
{
    _rigidbody.MovePosition(Vector3.MoveTowards(_rigidbody.position, target.position, Time.deltaTime * movespeed));
}

推荐阅读