意外破坏Unity中的BoxCollider

时间:2019-04-25 01:02:06

标签: c# unity3d

我在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);
        }
    }
}
}

实际脚本更长,并且为accessible here

leftHandAnchor预制件是来自上述场景的hand_left部分的LocalAvatarWithGrab,而rightHandAnchorhand_rightballPrefab是默认的GameObject-> 3D Object-> Sphere,其中添加了Box ColliderRigidbody(重力关闭,运动开启)和OVRGrabbable组件。

因此,用户使用BY创建了球,并能够通过抓住索引触发器并放开来移动它们。然后说,A在右边的控制器靠近球时被按下(它确实被销毁了)。但是,如果用户尝试使用索引触发器(在右侧)移动另一个球,则在控制台中会出现以下错误:

enter image description here

左手索引触发器仍然可以移动任何对象,但是一旦使用右手控制器上的X删除对象,就不能像右手一样抓住其他对象。

我对问题原因的猜测是:

  1. SphereCastAll正在捡起手的对撞机并将其删除,或者
  2. 预制球正在从锚点继承对撞机,而破坏球也在破坏手。

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

  • 在预制球上添加一个BALL标签,只有在SphereCastAll捡起带有该标签的物体时才能销毁。
  • 在摧毁球之前,检查BoxCollidergameObject是否不是null
  • 将向量传递到RemoveBall而不是手的GameObject,然后在该向量附近进行SphereCastAll

这些都没有解决问题。我当前的解决方案是破坏球的MeshRenderer并打开重力,以使球下降到场景的底部。目前,这很好,但是每增加一个球,就会添加更多的对象(可以达到约10000个对象),并且场景变得非常慢,因此我希望能够干净地破坏这些球。所以我的问题是:

  

如何消灭GameObject而又不消灭那只手   摧毁它?

1 个答案:

答案 0 :(得分:0)

您已经尝试过使用代码进行尝试,但是尝试为您的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);
}
相关问题