[英]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.