繁体   English   中英

无意中破坏了Unity中的BoxCollider

[英]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_leftLocalAvatarWithGrab所提到的场景的一部分,而rightHandAnchorhand_right ballPrefab是默认的ballPrefab - > 3D Object - > Sphere,其中包含Box ColliderRigidbody (重力关闭,运动启动)和OVRGrabbable组件。

因此,用户使用BY创建球,并且能够通过抓取索引触发器并放开来移动它们。 然后,比如说,当A靠近一个球去除时, A被压在右侧控制器上(并且它会被摧毁)。 但是,如果用户尝试使用索引触发器(在右侧)移动另一个球,我在控制台中收到以下错误:

在此输入图像描述

左手索引触发器仍可用于移动任何对象,但只要右手控制器上的X用于删除对象,就不会像右手那样抓住其他对象。

我对问题原因的猜测是:

  1. SphereCastAll正在拿起手的SphereCastAll并将其删除,或者
  2. 球预制件继承了锚的对撞机,并且摧毁球也在摧毁手。

为了解决这个问题,我尝试了以下方法:

  • BALL标签添加到球预制件中,只有在SphereCastAll选择带有该标签的对象时才会销毁。
  • 在销毁球之前检查BoxCollidergameObject是否为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM