loui1337 Geschrieben 30. Juni 2020 Melden Share Geschrieben 30. Juni 2020 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 zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Hermetes Geschrieben 30. Juni 2020 Melden Share Geschrieben 30. Juni 2020 Es sollte gehen wenn du dein Code für den Button in die Couroutine steckst. Unter yield return new WaitForSeconds(1). Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 1. Juli 2020 Melden Share Geschrieben 1. Juli 2020 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 zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
loui1337 Geschrieben 1. Juli 2020 Autor Melden Share Geschrieben 1. Juli 2020 Vielen vielen dank für die Antworten, aber warum genau sind die Update und OnMouseDown Methode private?😅 Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
loui1337 Geschrieben 1. Juli 2020 Autor Melden Share Geschrieben 1. Juli 2020 Und noch eine Frage: das funktioniert immer noch nicht... sobald ich auf das Gameobject klicke wird sofort ein neues erstellt. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
chrische5 Geschrieben 1. Juli 2020 Melden Share Geschrieben 1. Juli 2020 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 zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 1. Juli 2020 Melden Share Geschrieben 1. Juli 2020 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 zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
chrische5 Geschrieben 1. Juli 2020 Melden Share Geschrieben 1. Juli 2020 Hallo Ich mache es auch so, wusste aber nicht, was da Standard ist. Alles was steht, kann ich lesen, wenn ich nix schreibe, brauche ich zusätzliches Wissen... Also mache ich es mir einfach. Christoph Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Hermetes Geschrieben 1. Juli 2020 Melden Share Geschrieben 1. Juli 2020 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 zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Hermetes Geschrieben 1. Juli 2020 Melden Share Geschrieben 1. Juli 2020 Du führst außerdem mit OnMouseDown und Input.GetMouseButton(0) das selbe aus. Möchtest du den Zustand das die Mouse über einem Objekt erfassen dann heisst es : OnMouseOver() Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.