我是Unity的新手,正在努力获取OnCollisionEnter
函数。
我意识到这听起来与其他问题相似,但仍然无法解决我的问题。
我正在使用Oculus Distance Grab示例场景。
我有一个试图碰到足球的障碍;)
该方块具有盒式对撞机(非扳机)和刚体(非重力,非运动学)。
足球具有一个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
层中。我仔细检查了“播放器设置”冲突矩阵中这些层之间是否启用了冲突。
此外,每个对象的碰撞器似乎都是与网格匹配的大小。
任何有助于使碰撞正常进行的帮助都将是美好的!
这里也是设置的外观:
UPDATE:
这里是浮动块的Update
方法:
void FixedUpdate () {
if(targetTransform != null) {
this.transform.position = Vector3.MoveTowards(this.transform.position, targetTransform.transform.position, Time.deltaTime * moveSpeed);
}
}
我一直很难使任何调试日志显示在控制台中,因此它们并不可靠。但是答案是,碰撞实际上是有效的,但是我正在销毁错误的物体。
将其更改为Destroy(col.collider.gameObject)
有效。在这里学到的重要区别!谢谢!
UPDATE 2:
我已经添加了如何设置OVRPlayerController
的图像。试图通读有关此character controller
组件的薄弱文档,但据我了解,它包含一个胶囊对撞机。
只要涉及Rigidbody
,就应该NOT设置
transform.position = Vector3.MoveTowards(...);
而是通过Rigidbody
组件,例如使用MovePosition
MovePosition
移动Rigidbody.MovePosition
并符合插值设置。启用Rigidbody
插值后,Rigidbody
将在帧之间创建平滑过渡。
[通过Rigidbody.MovePosition
移动时,这将保持物理原封不动,会产生硬跳,不会对碰撞产生反应!
transform.position