我在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
,而rightHandAnchor
是hand_right
。 ballPrefab
是默认的GameObject-> 3D Object-> Sphere,其中添加了Box Collider
,Rigidbody
(重力关闭,运动开启)和OVRGrabbable
组件。
因此,用户使用B
或Y
创建了球,并能够通过抓住索引触发器并放开来移动它们。然后说,A
在右边的控制器靠近球时被按下(它确实被销毁了)。但是,如果用户尝试使用索引触发器(在右侧)移动另一个球,则在控制台中会出现以下错误:
左手索引触发器仍然可以移动任何对象,但是一旦使用右手控制器上的X
删除对象,就不能像右手一样抓住其他对象。
我对问题原因的猜测是:
SphereCastAll
正在捡起手的对撞机并将其删除,或者为解决此问题,我尝试了以下方法:
BALL
标签,只有在SphereCastAll
捡起带有该标签的物体时才能销毁。BoxCollider
和gameObject
是否不是null
。RemoveBall
而不是手的GameObject
,然后在该向量附近进行SphereCastAll
。这些都没有解决问题。我当前的解决方案是破坏球的MeshRenderer
并打开重力,以使球下降到场景的底部。目前,这很好,但是每增加一个球,就会添加更多的对象(可以达到约10000个对象),并且场景变得非常慢,因此我希望能够干净地破坏这些球。所以我的问题是:
如何消灭
GameObject
而又不消灭那只手 摧毁它?
答案 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);
}