0

我编写了一个用于在 TopDown-Shooter 中打开门的控制器。

我围绕它们的本地 Y 轴旋转枢轴点以打开门对象。门应该保持打开状态,所以我不再需要 Controller 和 Controller 对象了。我想在完成它的工作后摧毁它。

我的脚本看起来是这样的:

public class DoorController : MonoBehaviour
{
    public Transform pivotLeftTransform; // the left pivot point
    public Transform pivotRightTransform; // the right pivot point

    int openAngle = 90; // how far should the door open up?
    bool startOpen = false; // start opening?
    float smooth = 2; // smooth rotation

    private void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.tag == "Player")
        {
            startOpen = true; // when the Player triggers, start opening
        }
    }

    void Update()
    {
        if (startOpen)
        {
            OpenDoor(pivotLeftTransform, openAngle);
            OpenDoor(pivotRightTransform, -openAngle);

            if (pivotLeftTransform.localRotation.y == openAngle && pivotRightTransform.localRotation.y == -openAngle) // when the doors are rotated, destroy this object
            {
                Destroy(gameObject);
            }
        }
    }

    private void OpenDoor(Transform pivotTransform, int rotationAngle)
    {
        Quaternion doorRotationOpen = Quaternion.Euler(0, rotationAngle, 0); // desired door rotation
        pivotTransform.localRotation = Quaternion.Slerp(pivotTransform.localRotation, doorRotationOpen, smooth * Time.deltaTime); // rotate the door to the desired rotation
    }
}

我的问题是,我怎样才能销毁对象。我的代码

if (pivotLeftTransform.localRotation.y == openAngle && pivotRightTransform.localRotation.y == -openAngle)   

似乎不起作用。在将枢轴点旋转到 90 或 -90 度后,该语句仍然保持错误。我也试过

pivotTransform.rotation.y

但它也不起作用。我需要通过哪个轮换?

谢谢。

4

2 回答 2

1

您的代码中有两处错误:

1 .比较浮点数

2 .使用transform.localRotationtransform.rotation检查角度。

您可以使用eulerAnglesor解决此问题localEulerAngles。同样对于比较浮点数,使用>=而不是=因为这可能永远不会正确。

代替

if (pivotLeftTransform.localRotation.y == openAngle && pivotRightTransform.localRotation.y == -openAngle)
{
    Destroy(gameObject);
}

if (pivotLeftTransform.localEulerAngles.y >= openAngle && pivotRightTransform.localRotation.y >= -openAngle)
{
    Destroy(gameObject);
}

如果您对上述答案有疑问,则必须一一解决。分开&&并查看哪个失败,如下所示:

if (pivotLeftTransform.localEulerAngles.y >= openAngle)
{
    Debug.Log("pivotLeftTransform");
}

if (pivotRightTransform.localRotation.y >= -openAngle)
{
    Debug.Log("pivotRightTransform");
}
于 2017-01-18T18:31:27.547 回答
-1

存档的正确方法是添加一个小的容差值:

if (pivotLeftTransform.localEulerAngles.y >= openAngle - 0.1f && pivotRightTransform.localEulerAngles.y <= 360 - openAngle + 0.1f)

这可能不是代码干净,但目前可以使用:)

于 2017-01-19T05:59:29.047 回答