[英]Unintentionally destroying BoxCollider in Unity
我在Unity 2018.2.8f1中有一个基于AvatarGrab
示例场景的场景(这是在Assets / Oculus / SampleFramework / Usage中,使用“Oculus Integration”包),用户应该能够创建,移动,并删除场景中的对象。 我的问题是,在使用Instantiate
在其中一个手的位置创建一个对象,然后使用Destroy
删除它之后,用户无法抓取场景中的任何其他对象。 这是一个附加到场景的最小脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Creator : MonoBehaviour {
public GameObject leftHandAnchor;
public GameObject rightHandAnchor;
public GameObject ballPrefab;
void Update () {
if (OVRInput.GetDown(OVRInput.RawButton.B)) {
if (rightHandAnchor != null) {
AddBall(rightHandAnchor);
}
}
if (OVRInput.GetDown(OVRInput.RawButton.Y)) {
if (leftHandAnchor != null) {
AddBall(leftHandAnchor);
}
}
if (OVRInput.GetDown(OVRInput.RawButton.A)) {
if (rightHandAnchor != null) {
RemoveBall(rightHandAnchor);
}
}
if (OVRInput.GetDown(OVRInput.RawButton.X)) {
if (leftHandAnchor != null) {
RemoveBall(leftHandAnchor);
}
}
}
void AddBall (GameObject anchor) {
GameObject clone = (GameObject)Instantiate(ballPrefab, anchor.transform.position, anchor.transform.rotation);
}
void RemoveBall (GameObject anchor) {
RaycastHit[] hits = Physics.SphereCastAll(anchor.transform.position, 0.03f, anchor.transform.forward, 0f);
foreach (RaycastHit ball in hits){
if (ball.transform.gameObject.tag == "BALL") {
Destroy(ball.transform.gameObject);
}
}
}
}
实际脚本更长, 可在此处访问 。
该leftHandAnchor
预制的hand_left
从LocalAvatarWithGrab
所提到的场景的一部分,而rightHandAnchor
是hand_right
。 ballPrefab
是默认的ballPrefab
- > 3D Object - > Sphere,其中包含Box Collider
, Rigidbody
(重力关闭,运动启动)和OVRGrabbable
组件。
因此,用户使用B
或Y
创建球,并且能够通过抓取索引触发器并放开来移动它们。 然后,比如说,当A
靠近一个球去除时, A
被压在右侧控制器上(并且它会被摧毁)。 但是,如果用户尝试使用索引触发器(在右侧)移动另一个球,我在控制台中收到以下错误:
左手索引触发器仍可用于移动任何对象,但只要右手控制器上的X
用于删除对象,就不会像右手那样抓住其他对象。
我对问题原因的猜测是:
SphereCastAll
正在拿起手的SphereCastAll
并将其删除,或者 为了解决这个问题,我尝试了以下方法:
BALL
标签添加到球预制件中,只有在SphereCastAll
选择带有该标签的对象时才会销毁。 BoxCollider
和gameObject
是否为null
。 RemoveBall
,而不是手的GameObject
,然后做SphereCastAll
该矢量附近。 这些都没有解决问题。 我目前的解决方案是摧毁球的MeshRenderer
并打开重力,使球MeshRenderer
场景的底部。 现在这很好,但是每个球都会添加更多的物体(可以期望它达到~10 000个物体),并且场景变得非常慢,所以我希望能够干净地摧毁球。 所以我的问题是:
如何在不破坏正在摧毁它的手
GameObject
情况下销毁GameObject
?
您已经尝试过使用标签,但这可能仍然可以尝试为您的spherecast提供一个图层:
LayerMask checkThis = indexOfLayersToCheck;
RaycastHit[] hits = Physics.SphereCastAll(anchor.transform.position, 0.03f, anchor.transform.forward, 0f, checkThis);
它是否缺少手提箱对撞机? 如果是,这将是非常奇怪的意味着除非手具有相同的标签,否则它不会收听标签? 当球形播放器完成它的工作时,产生的对象是否被完全破坏(检查器内部没有任何东西留下)?
并尝试像这样摧毁它
if (ball.transform.gameObject.tag == "BALL") {
Destroy(ball.collider.gameObject);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.