2015-04-12 103 views
-1

我有一個腳本讓玩家打開和關閉門,但是當我按下按鈕關閉門時,它會關閉然後再次打開。我懷疑這是因爲lerp不停止或什麼。我怎樣才能解決這個問題?怎麼了? 謝謝!C#編程邏輯(Unity3d腳本)

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); 
    } 
} 
} 
+0

我對團結並不太熟悉,但我可以想象它是由於遊戲循環沒有意識到按鍵和按鍵的區別,所以這意味着您不斷地改變其打開狀態,我是肯定團結有一定的發現這種方式.. – Sayse

+0

@Sayse你是對的,團結有一種處理方式,但在提供的代碼中,它已經使用正確的方式,因爲Input.GetKeyDown()只適用於第一次更新自按鍵被按下 – grexter89

+0

旋轉是否實際上是lerp或是門打開和關閉? – grexter89

回答

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值。假設你想要平滑過渡,你可能想要使用當前的旋轉而不是硬編碼的四元數。

+0

謝謝!它現在完美。我用修改後的transform.rotation替換了四元數,以及:) –