【问题标题】:Unity - Destroy the DoorController after finishing the taskUnity - 完成任务后销毁 DoorController
【发布时间】:2017-01-18 18:13:03
【问题描述】:

我编写了一个用于在 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

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

谢谢。

【问题讨论】:

    标签: c# unity3d 3d rotation topdown


    【解决方案1】:

    您的代码中有两处错误:

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

    【讨论】:

    • 感谢您的回复!可悲的是,这些建议都没有奏效:(
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-23
      • 1970-01-01
      • 2015-11-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多