团结 - 完成任务后摧毁门禁控制器



我已经编写了一个控制器脚本,用于在TopDown-Shooter中打开门。

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

我的脚本如下所示:

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 度后,语句仍然保持 false。我也试过

pivotTransform.rotation.y

但它也不起作用。我需要传入哪个旋转?

谢谢。

代码中有两点错误:

1.比较浮点数

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

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

取代

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");
}

正确的架构方法是添加一个小的容差值:

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

这可能不是代码干净的,但它目前有效:)

相关内容

  • 没有找到相关文章

最新更新