簡體   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