2013-06-05 31 views
12

Kịch bản/trò chơi/điều của tôi làm cho di chuyển gameobject sang phải và khi tôi nhấp vào khiêu vũ (một nút tôi đã tạo) nó dừng lại. Sau đó, khi truy cập (tôi có thể không cần một truy cập nhưng tôi muốn chờ 3 giây) đạt đến như 3 (một khi bạn bấm vào nhảy truy cập bắt đầu) Gameobject của tôi là giả sử để tiếp tục đi bên phải.Làm thế nào tôi có thể chờ 3 giây và sau đó đặt bool thành true, trong C#?

Nếu bạn có thể sửa mã sẽ nguội. Nếu bạn có thể sửa chữa nó và giải thích cho tôi những gì tôi đã làm sai nó sẽ thậm chí còn tuyệt vời hơn. Tôi mới bắt đầu học C# về Unity.

using System; 
using UnityEngine; 
using System.Collections; 

public class HeroMouvement : MonoBehaviour 
{ 
    public bool trigger = true; 
    public int counter = 0; 
    public bool timer = false; 

    // Use this for initialization 

    void Start() 
    { 
    } 

    // Update is called once per frame 

    void Update() 
    { //timer becomes true so i can inc the counter 

     if (timer == true) 
     { 
      counter++; 
     } 

     if (counter >= 3) 
     { 
      MoveHero();//goes to the function moveHero 
     } 

     if (trigger == true) 
      transform.Translate(Vector3.right * Time.deltaTime); //This moves the GameObject to the right 
    } 

    //The button you click to dance 
    void OnGUI() 
    { 
     if (GUI.Button(new Rect(10, 10, 50, 50), "Dance")) 
     { 
      trigger = false; 
      timer = true;//now that the timer is set a true once you click it,The uptade should see that its true and start the counter then the counter once it reaches 3 it goes to the MoveHero function  
     } 
    } 

    void MoveHero() 
    { //Set the trigger at true so the gameobject can move to the right,the timer is at false and then the counter is reseted at 0. 
     trigger = true; 
     timer = false; 
     counter = 0; 
    } 
} 
+4

Bạn cần phải đi dễ dàng trên các khoảng trắng ... – paddy

+0

yeah, có thể đã có 1/5 của các dòng! – ApolloSoftware

+0

Phải được thanh toán trong klocs :) – ApolloSoftware

Trả lời

3

Lần đầu tiên thực hiện truy cập phao. Sau đó, thay đổi counter++; thành counter += Time.deltaTime. Update() được gọi cho mỗi khung hình sao cho bộ đếm sẽ là 3 trên khung thứ ba. Time.deltaTime cung cấp cho bạn thời gian giữa khung này và khung trước đó. Tổng hợp nó hoạt động như một bộ hẹn giờ.

+0

Cảm ơn bạn đã thử rằng – Froob

-7

nếu bạn chỉ cần chờ đợi, bạn có thể sử dụng phương pháp ngủ của Chủ đề

System.Threading.Thread.Sleep(3000); 
+2

Điều này sẽ đóng băng vòng lặp cập nhật. Bạn không nên chờ đợi trong vòng lặp cập nhật bằng cách sử dụng giấc ngủ thread. –

+0

Làm cho luồng ngủ không phải là giải pháp tốt cho vấn đề này. @ JanThomä là chính xác. – SlxS

+0

Mã này sẽ cố định chủ đề chính. Đừng làm điều này. –

14

Bạn có thể làm điều đó khá dễ dàng với coroutines:

void Update() 
{ 
    if (trigger == true) 
     transform.Translate(Vector3.right * Time.deltaTime); //This moves the GameObject to the right 
} 

void OnGUI() 
    { 
     if (GUI.Button(new Rect(10, 10, 50, 50), "Dance")) 
     { 
      StartCoroutine(DoTheDance()); 
     } 
    } 


public IEnumerator DoTheDance() { 
    trigger = false; 
    yield return new WaitForSeconds(3f); // waits 3 seconds 
    trigger = true; // will make the update method pick up 
} 

Xem http://docs.unity3d.com/Documentation/ScriptReference/index.Coroutines_26_Yield.html để biết thêm thông tin về coroutines và làm thế nào để sử dụng chúng. Chúng khá gọn gàng khi cố gắng thực hiện chuỗi sự kiện theo thời gian.

+0

Tôi cần dòng coroutine bắt đầu được viết như thế này để nó hoạt động trong Unity 5: StartCoroutine (DoTheDance()); – skribbz14

+1

Cảm ơn, tôi đã cập nhật mã. –

2

Tôi thích sử dụng StartCoroutine đây là liên kết: http://docs.unity3d.com/ScriptReference/MonoBehaviour.StartCoroutine.html

ví dụ:

void Foo() { StartCoroutine (Begin()); } 

    IEnumerator Begin() 
    { 
     yield return new WaitForSeconds (3); 

     // Code here will be executed after 3 secs 
     //Do stuff here 
    } 
+0

Trong khi liên kết này có thể trả lời câu hỏi, tốt hơn nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở thành không hợp lệ nếu trang được liên kết thay đổi. – Ghost

+0

Cảm ơn Ghost! :) Chỉ cần chỉnh sửa ans của tôi. –

-2

Tôi sẽ sử dụng này nếu multi-threading:

DateTime a = DateTime.Now; 
    DateTime b = DateTime.Now.AddSeconds(2); 

    while (a < b) 
    { 
     a = DateTime.Now; 
    } 

    bool = x; 
+0

Thụt lề mã của bạn. – gsamaras

+1

Điều này sẽ quay chủ đề ... tìm kiếm giải pháp thay thế !! – hooby3dfx

7

Tôi nghĩ rằng đơn giản nhất cách đang sử dụng Gọi:

Unity3D Invoke

if (timer == true) Invoke("MoveHero", 3);

Các vấn đề liên quan