我在场景中有一个 Xr 原点,用户可以戴上头盔并将其摘下(xr 原点上有一个触发器),父子关系很好,但取消父子关系却不行?我已经尝试了一切从
other.transform.SetParent(null, true);
other.transform.SetParent(null);
other.transform.parent = null;
public static bool helmetIsOn;
private Transform parentTransform;
private XRGrabInteractable interactable;
private void Start()
{
parentTransform = transform;
helmetIsOn = false;
}
private void OnTriggerEnter(Collider other)
{
if (other.gameObject.CompareTag("SafetyHelmet"))
{
Debug.Log("Helmet is On");
interactable = other.gameObject.GetComponent<XRGrabInteractable>();
if (interactable != null)
{
interactable.enabled = false;
}
other.transform.SetParent(parentTransform);
other.transform.localPosition = Vector3.zero;
other.transform.localRotation = Quaternion.identity;
StartCoroutine(EnableInteraction());
helmetIsOn = true;
}
}
private IEnumerator EnableInteraction()
{
yield return new WaitForSeconds(1);
if (interactable != null)
{
interactable.enabled = true;
}
}
private void OnTriggerExit(Collider other)
{
if (other.gameObject.CompareTag("SafetyHelmet"))
{
Debug.Log("Helmet is Off");
other.transform.parent = null;
helmetIsOn = false;
}
}
你的 Debug.Log 被调用了吗?如果没有的话我会检查你的碰撞情况。 如果正在调用它,那么也许在头盔取消父级之后,它会再次进入触发器并重新设置父级?
好的,所以我找到了一个“解决方案”,我所做的就是将它放入一个函数中,并在 0.5f 秒后调用它并运行。
private IEnumerator DeParent()
{
yield return new WaitForSeconds(0.5f);
helmet.transform.parent = null;
}
private void OnTriggerExit(Collider other)
{
if (other.gameObject.CompareTag("SafetyHelmet"))
{
Debug.Log("Helmet is Off");
StartCoroutine(DeParent());
helmetIsOn = false;
}
}