Unity - 如何在 XR Origin 上分离游戏对象?

问题描述 投票:0回答:2

我在场景中有一个 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;
    }
}
c# unity-game-engine virtual-reality unityscript
2个回答
0
投票

你的 Debug.Log 被调用了吗?如果没有的话我会检查你的碰撞情况。 如果正在调用它,那么也许在头盔取消父级之后,它会再次进入触发器并重新设置父级?


0
投票

好的,所以我找到了一个“解决方案”,我所做的就是将它放入一个函数中,并在 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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.