2016-06-19 11 views
1

Ich arbeite derzeit an Unity und C# Sprache verwenden.Verzögerung in C# in Unity3D-Projekten hinzufügen

Bei weitem muss ich etwas tun (im kleinsten Fall, laden Sie eine andere Szene).

Meine Frage ist, wie das etwas passiert, nach ein paar Sekunden setze ich den Cursor auf den Bereich?

Dies ist mein Code jetzt.

if (_newGameButton.Contains (Event.current.mousePosition)) { 
       Application.LoadLevel (1); 
       Destroy (this); 
      } 

Ich möchte Verzögerung hinzufügen, wenn _newGameButton aktiv ist. Gerade jetzt, wenn ich den Cursor über _newGameButton bewege, wird Szene 1 sofort geladen. Ich habe viele Möglichkeiten wie Invoke und WaitForSeconds versucht. Keine funktioniert. Wenn der Fehler ist, wie ich es benutze, wie ist der richtige Weg? Vielen Dank für deine Hilfe.

EDIT: Diese Frage ist beantwortet und ich habe eine andere Frage in Activate and Deactivate Invoke function.

+0

Mikurin, um Timer in Unity zu machen, verwenden Sie einfach ** Invoke **. sehr leicht. – Fattie

Antwort

2

Um Timer und Verzögerungen bei der Einheit zu machen, einfach Invoke verwenden

void Start() 
{ 
Debug.Log("hello from Start."); 
Invoke("Test", 3f); 
} 

private void Test() 
{ 
Debug.Log("hello from 'Test'"); 
} 

Ebenfalls sehr praktisch ist InvokeRepeating

Invoke("Test", 5f, 0.5f); 

Es so einfach ist.

In Ihrem Fall

if (_newGameButton.Contains (Event.current.mousePosition)) 
    { 
    Invoke("YourSceneName"); 
    } 

private void ChangeScenes() 
{ 
UnityEngine.SceneManagement.SceneManager.LoadScene("ScreenMain"); 
} 

Sie MÜSSEN die Szene-Namen verwenden. Vergiss nicht, du MUSST DIE SZENE AUF DIE SZENENLISTE GESTEUERT HABEN. Schau dir "Build Settings" "Szenen in Build" an.


Hinweis

, die nicht wirklich ist, wie Sie in diesen Tagen Szenen in Unity laden. Sie haben die Syntax geändert. es ist eher wie dieses ...

UnityEngine.SceneManagement.SceneManager.LoadScene("ScreenMain"); 

Wenn Sie asynchron

AsyncOperation ao; 
ao = UnityEngine.SceneManagement.SceneManager.LoadSceneAsync("SceneName"); 
while (!ao.isDone) 
    { 
    Debug.Log("loading " +ao.progress.ToString("f2")); 
    yield return null; 
    } 

laden möchten Wenn Sie Fragen zu Laden von Szenen haben, fragen Sie sie separat als eine neue Frage. Beachten Sie, dass Sie dies fast NICHT tun sollten "Destroy (this);".

+0

Ich benutze Unity 5.1.1 und das SceneManagement funktioniert nicht. Und Invoke funktioniert auch nicht. Mein if ist onGUI-Funktion. Muss die ChangeScenes-Funktion nach onGUI-Funktion oder vorher sein? – Mikuriin

+0

Hallo, sagst du, dass das nicht funktioniert: 'UnityEngine.SceneManagement .SceneManager .LoadScene (" ScreenMain ");' @Mikuriin – Fattie

+0

Ja, ist es. Aber es ist eigentlich egal. Das Problem ist, _newGameButton ist ein Rechteck, kein Button und die Funktion, die ich benutze, um die Szene zu laden, ist in der OnGUI-Funktion und ich habe verwirrt, wo sollte ich die ChangeScenes-Funktion setzen. Nach oder vor der onGUI-Funktion. – Mikuriin

1

Nun, ich kann Ihnen helfen, etwas zu verstehen, das größer ist als pausieren, weil es so aussieht, als würden Sie versuchen, auf OnClick-Events zu erstellen, heutzutage wird es anders verwendet.

, was Sie wirklich tun möchte, ist nur das SceneLoader Skript erstellen, die eine sehr allgemeine Skript wie das folgende sein kann,

using UnityEngine; 
using UnityEngine.UI; 
public class UIController : MonoBehaviour { 

public int numOfSceneToLoad; // number of the scene from the build settings 

    public void LoadSceneNumber(numOfSceneToLoad){ 
    UnityEngine.SceneManagement.SceneManager.LoadScene(numOfSceneToLoad); 
    } 

} 

und dann wollen Sie dieses Skript zu Ihrem Haupt-UI Canvas/Holderplace befestigen , gehen Sie zu Ihrer Schaltfläche und am unteren Rand des Inspektors sehen Sie onClick(), klicken Sie auf das + Zeichen und dann machen Sie die Einrichtung wie folgt, ziehen Sie das Objekt, an das Sie dieses Skript angehängt haben, und legen Sie es unter der "Laufzeit" laber in diesem kleinen onClick() Fenster, dann blättern Sie und finden Sie diese spezielle Funktion, die wir gerade erstellt haben und in dort können Sie den Wert von numOfSceneToLoad zu der Szene ändern, die Sie laden möchten, und woilla Sie haben ein dynamisches scr ipt, um eine beliebige Szene zu laden.

In diesem Sinne erkläre ich Sie auf einige ziemlich erstaunliche toturials von Einheit gemacht, die Ihnen beibringen wird, wie man eine ordnungsgemäße UI in unity5.

http://unity3d.com/learn/tutorials/topics/user-interface-ui/ui-button

+0

es ist eine nette Erklärung. – Fattie

0

Aus Ihrer Beschreibung, sieht es für mich, dass Ihre _newGameButton standardmäßig auf inaktiv gesetzt ist und Sie wollen es aktiv und Benutzer hartnäckige nach wenige Verzögerung.

Dafür können Sie ein Skript erstellen und anhand von _newGameButton darin, so etwas wie dies halten:

public GameObject _newGameButton; 

und auf einem Ereignis sagen GameOver, wie dies umzusetzen:

void GameOver() 
{ 
    Invoke("EnableNewGameButtonAfterDelay", 5f); 
} 


void EnableNewGameButtonAfterDelay() 
{ 
    _newGameButton.SetActive(true); 
    // now this game object is active and user can click on it. 
} 

In dieser Beispiel Ich habe gezeigt, dass das Spiel vorbei ist und nach 5 Sekunden Verzögerung muss der Benutzer ein neues Spielfeld aktivieren. [Dieser Code ist nicht in ausführbarer Form und nur um Ihnen eine Idee zu geben]

Hoffe, das hilft!

+0

_newGameButton ist ein Rechteck, keine Schaltfläche. Der Fall ist, dass ich Kinect und Kinect MS-SDK aus Asset Store verwende, ich wusste nicht, wie man mit Kinect klickt, also verwende ich Rechteck, um ein Event zu starten. Und dann tritt es sofort auf, wenn der Cursor zum Rechteck bewegt wird. Daher kann _newGameButton.SetActive nicht verwendet werden – Mikuriin