Jump to content
Unity Insider Forum

Warten auf Event


loui1337

Recommended Posts

Moin!

Ich hätte da noch eine Frage wegen meinem Kleinem Spiel:
Ich möchte gerne das man erst ein GameObject auswählt und man anschließend weitere Events machen kann... bei mir geht es nachdem ich darauf geklickt sofort los und die Methode wird ausgeführt... Kann mir da jemand helfen?

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Newplatform : MonoBehaviour
{
    public GameObject Platform;
    void OnMouseDown()
    {
		StartCoroutine (WaitTime());
		if (Input.GetMouseButtonDown(0))
        {
            Vector2 screenPosition = new Vector2(Input.mousePosition.x, Input.mousePosition.y);
            Vector2 ClickWorldPosition = Camera.main.ScreenToWorldPoint(screenPosition);
            Debug.Log(ClickWorldPosition);
			
			Instantiate(Platform, ClickWorldPosition, transform.rotation);
        }
	IEnumerator WaitTime()
	{
		//Für Wartezeit nach Klick in Zeile 14
		yield return new WaitForSeconds (1);
		
	}
    }
}

 

Link to comment
Share on other sites

Genau richtig: StartCoroutine startet eine Coroutine, aber wartet nicht, bis sie fertig ist. Das würdest du auch gar nicht wollen, denn deine OnMouseDown-Methode wird im Hauptthread ausgeführt. Wenn du da wirklich eine Sekunde warten würdest, würde dein Spiel eine Sekunde lang einfrieren.

Allerdings passen deine Problembeschreibung und dein Code sowieso nicht ganz zueinander.

vor 18 Stunden schrieb loui1337:

Ich möchte gerne das man erst ein GameObject auswählt und man anschließend weitere Events machen kann...

Da musst du den Zustand deines Objekt ändern und nicht auf irgendetwas warten:

private bool selected;

private void OnMouseDown()
{
  selected = true;
}

private void Update()
{
  if (selected && Input.GetMouseButtonDown(0))
  {
    // ...
  }
}

 

Link to comment
Share on other sites

vor 3 Stunden schrieb loui1337:

Vielen vielen dank für die Antworten, aber warum genau sind die Update und OnMouseDown Methode private?😅

Hallo

 

Wenn du nix hinschreibst, ist private default. Es ist also egal, ob du nichts oder private schreibst.

 

Christoph

Link to comment
Share on other sites

vor 5 Stunden schrieb chrische5:

Wenn du nix hinschreibst, ist private default. Es ist also egal, ob du nichts oder private schreibst.

Das ist richtig, aber es gibt halt die Grundregel dass Explizit besser als Implizit ist. Die Funktionsweise ist dieselbe, aber mit expliziten Modifikatoren ist's besser für die Code-Qualität :) Ich mach's daher immer so, werfe es aber niemandem vor, wenn es anders gemacht wird.

Link to comment
Share on other sites

Hast du denn deine Coroutine aufgerufen? 
Ich habe mir erlaubt Saschas Code etwas zu modifizieren. selected dann wieder von dir auf false gesetzt werden, da das sonst nur einmal funktioniert. 

Es ist für den User ziemlich irritierend wenn eine Sekunde lang keine Rückmeldung kommt. Du kannst das z.B auch auf 0.2f verkürzen. 
 

private bool selected;

private void OnMouseDown()
{
  	
  StartCoroutine (WaitTime());
}

private void Update()
{
  if (selected)
  {
    // ...
  }
}

IEnumerator WaitTime()
	{
		
		yield return new WaitForSeconds (1);
		selected = true;
	}
    }


 

 

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...