2014-10-28 105 views
0

我正在用一些動畫編寫遊戲,並在用戶單擊按鈕時使用這些動畫。我想向用戶展示動畫,而不是「只」用Application.loadLevel調用新的關卡。我想我可以在onMouseUp方法中使用Time.DeltaTime並將其添加到預定義的0f值,然後檢查它是否大於(例如)1f,但它不會工作,因爲onMouseUp方法只會添加「它是自己的時間「作爲德爾塔時間。如何等待幾秒鐘,然後在OnMouseUp事件中做點什麼

我的腳本看起來現在這個樣子:

public class ClickScriptAnim : MonoBehaviour { 

public Sprite pressedBtn; 
public Sprite btn; 
public GameObject target; 
public string message; 
public Transform mesh; 
private bool inAnim = true; 
private Animator animator; 
private float inGameTime = 0f; 

// Use this for initialization 
void Start() { 
    animator = mesh.GetComponent<Animator>(); 
} 



// Update is called once per frame 
void Update() { 

} 

void OnMouseDown() { 
    animator.SetBool("callAnim", true); 

} 

void OnMouseUp() { 
    animator.SetBool("callAnim", false); 
    animator.SetBool("callGoAway", true); 
    float animTime = Time.deltaTime; 

    Debug.Log(inGameTime.ToString()); 
// I would like to put here something to wait some seconds 
     target.SendMessage(message, SendMessageOptions.RequireReceiver); 
     } 
    } 
} 
+0

Thread.Sleep(1000)將等待一秒鐘,你是否在尋找沿這些線的東西? – Bayeni 2014-10-28 13:33:47

+0

你試圖等待一段時間的代碼在哪裏? – Reniuz 2014-10-28 13:36:09

+0

正如我寫的,我試圖把一個inGameTime + = Time.deltaTime放到onMouseUp()方法中,但它不能像預期的那樣工作,因爲OnMouseUp方法只返回最小的deltaTime – Zwiebel 2014-10-28 13:43:41

回答

1

我不是完全肯定你的努力在onMouseUp使用Time.deltaTime做。這只是自上一幀渲染以來的幾秒鐘內的時間,無論您嘗試訪問它的位置都應該保持不變。通常它被用在一個被稱爲每幀的函數中,而不是像onMouseUp這樣的一次性事件。

儘管不是一定你想達到什麼目的,這聽起來像你應該使用調用:

http://docs.unity3d.com/ScriptReference/MonoBehaviour.Invoke.html

只要把你想被推遲到一個單獨的函數的代碼,然後調用該功能在onMouseUp中延遲。

編輯:要備份其他人在這裏說的話,我不會在這個實例中使用Thread.Sleep()。

1

您希望通過使用Coroutine阻止Update循環來完成此操作(以及所有看起來不會使遊戲「凍結」的等待函數)。

下面是您可能要查找的示例。

void OnMouseUp() 
{ 
    animator.SetBool("callAnim", false); 
    animator.SetBool("callGoAway", true); 

    //Removed the assignement of Time.deltaTime as it did nothing for you... 

    StartCoroutine(DelayedCoroutine()); 
} 

IEnumerator DoSomethingAfterDelay() 
{ 
    yield return new WaitForSeconds(1f); // The parameter is the number of seconds to wait 
    target.SendMessage(message, SendMessageOptions.RequireReceiver); 
} 

根據你的榜樣,很難確定究竟你想要什麼來完成但上面的例子是「正確」的方式在Unity 3D的延遲之後做一些事情。如果您想延遲動畫,只需將調用代碼放入協同程序中,就像我調用SendMessage一樣。

協程在它自己的特殊遊戲循環中啓動,與您遊戲的Update循環有點併發。這些對於許多不同的事情非常有用,並提供了一種「線程化」(儘管不是真正的線程化)。

注意
在Unity不要使用Thread.Sleep(),它會從字面上凍結的遊戲循環,如果在一個糟糕的時間內完成,可能導致崩潰。 Unity遊戲運行在處理所有生命週期事件(Awake()Start()Update()等)的單個線程上。調用Thread.Sleep()將停止這些事件的執行,直到它返回並且最有可能不是您正在查找的內容,因爲它會顯示遊戲已凍結並導致糟糕的用戶體驗。

相關問題