【问题标题】:C# programming logic (Unity3d script)C# 编程逻辑(Unity3d 脚本)
【发布时间】:2015-04-12 19:04:29
【问题描述】:

我有一个让玩家打开和关闭门的脚本,但是当我按下按钮关闭门时,它会关闭然后再次打开。我怀疑这是因为 lerp 没有停止或其他原因。我怎样才能解决这个问题?怎么了? 谢谢!

Door Script:

using UnityEngine;
using System.Collections;

public class DoorHandler : MonoBehaviour {
public bool isOpen = false;
public float maxOpenDistance = 10f, doorCloseTime = 3f;

void Update () {
    if (Input.GetKeyDown (KeyCode.F)) {
        if (Vector3.Distance (GameObject.FindGameObjectWithTag ("Player").transform.position, this.gameObject.transform.position) <= maxOpenDistance) {
            isOpen = !isOpen;
        }

    if (isOpen) 
        gameObject.transform.rotation = Quaternion.Lerp (Quaternion.Euler (transform.rotation.x, 0, transform.rotation.z),
                                                                 Quaternion.Euler (transform.rotation.x, 90, transform.rotation.z), doorCloseTime);
        } else {
        gameObject.transform.rotation = Quaternion.Lerp (Quaternion.Euler (transform.rotation.x, 90, transform.rotation.z),
                                                               Quaternion.Euler (transform.rotation.x, 0, transform.rotation.z), doorCloseTime);
    } 
}
}

【问题讨论】:

  • 我对统一不太熟悉,但我想这是由于游戏循环无法识别按键并按住键的差异,所以这意味着你不断改变它的开放状态,我敢肯定团结有一些发现这一点的方法..
  • @Sayse 你是对的,unity 有一种处理方式,但是在提供的代码中它已经以正确的方式使用,因为 Input.GetKeyDown() 仅适用于自密钥以来的第一次更新被按下
  • 旋转是否真的很慢,还是门跳开和关上?

标签: c# unity3d rotation logic quaternions


【解决方案1】:

您的大括号设置错误。您应该检查您的 IDE 是否具有自动格式化功能,以便您可以轻松找到这些错误。

void Update () {
    if (Input.GetKeyDown (KeyCode.F)) {
        if (Vector3.Distance (GameObject.FindGameObjectWithTag ("Player").transform.position, this.gameObject.transform.position) <= maxOpenDistance) {
            isOpen = !isOpen;
        }
    }

    if (isOpen) 
        gameObject.transform.rotation = Quaternion.Lerp (Quaternion.Euler (transform.rotation.x, 0, transform.rotation.z),
                                                         Quaternion.Euler (transform.rotation.x, 90, transform.rotation.z), doorCloseTime);
    else {
        gameObject.transform.rotation = Quaternion.Lerp (Quaternion.Euler (transform.rotation.x, 90, transform.rotation.z),
                                                         Quaternion.Euler (transform.rotation.x, 0, transform.rotation.z), doorCloseTime);
    } 
}

另外我不知道你是否在检查器中为doorCloseTime 设置了另一个值,但是3 没有任何意义。 Lerp 在两个值之间进行线性插值。您在 Lerp 方法中指定的参考值 (t) 理想情况下应该是介于 0 和 1 之间的值。最后,您还应该在 Lerp 方法中设置适当的 from 值。假设您想要平滑过渡,您可能想要使用当前旋转而不是硬编码的四元数。

【讨论】:

  • 谢谢!它现在完美运行。我也用修改过的 transform.rotation 替换了四元数 :)
猜你喜欢
  • 2011-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多