Jump to content
Unity Insider Forum

Wie programmiere ich richtig Trigger/Events?


Elharter

Recommended Posts

Hey,

 

nun ich bin mir nicht ganz sicher ob man das in Unity wirklich derartige bezeichnen kann > Trigger/Events.

 

Ich will euch mal erklären worum es geht, ich gebe ein Beispiel. Bestmöglich einfach gehalten.

 

 

1 Scene. 1 Spieler. 1 Controller.

Der Spieler drückt eine Taste (nehmen wir an "E").

 

Jetzt soll in void Update() in einer gewissen Zeitspanne etwas passieren.

Nehmen wir weiters an ein Gegenstand soll von A nach B bewegt werden.

 

Ich benötige also die Update-Funktion um über einen Speed-Faktor mit Time.Deltatime einen step zu ermitteln und dann verändere ich die Vector3-Werte des Objektes.

 

Dazu gibt es grundsätzlich in meinem Verständnis 2 Wege:

1. ich setze eine bool beim drücken (eistgedrückt = true/false) und prüfe dann in der Update auf diesen bool

2. ich halte die Taste E-gedrückt und in prüfe in der Update ob "E" gehalten wird....

 

Ich verwende in meinem Beispiel jetzt einfach mal Variante1.

 

  if (Input.GetKeyDown(KeyCode.E))
	{
		if (scriptA.ObjectMoveRequest== true)
		{
			scriptA.ObjectMoveRequest= false;
		} else
		{
			scriptA.ObjectMoveRequest= true;
		}
	}

 

Jetzt prüfe ich bei dem betroffenen Objekt in der Update-Funktion laufend auf die gedrückte Taste.

Und wenn diese erkennt das E gedrückt wurde, bewege ich das Objekt.

 

Soweit wunderbar.

 

if(ObjectMoveRequest== true)
		{
		    float step = speed * Time.deltaTime;
			gegenstandA.transform.position = Vector3.MoveTowards(gegenstandA.transform.position, new Vector3(gegenstandA.position.x, gegenstandA.transform.position.y, gegenstandA.position.z), step);
		}

Wenn der Gegenstand nun am Ziel angekommen ist, möchte ich dass die Berechnungen in der Update nicht laufend fortgeführt werden.

 

Dies ist ist aber nicht der Fall, da ich ja "nur" Prüfe ob die Taste gedrückt ist.

 

Und nun die eigentliche Frage:

Gibt es eine Möglichkeit EINMALIG eine Art Event auszuführen das ich nicht ständig in der Update direkt behandeln muss?

 

danke

 

 

 

Michael

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich würde da eine Coroutine dafür anlegen und die starten.

Die würde dann in etwa so aussehen

 


IEnumerator MoveObject(Vector3 targetPosition){
while(targetPositionNotReached){
Move();
yield return 0;
}
}
[/Code]

targetPositionNotReached und Move musst du da dann halt durch deinen entsprechenden Code ersetzen

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also ich glaube das einfachste ist, wenn Du eine Komponente dafür baust.

Diese bekommt ein Target.

Drückst Du einen Button, wird das Target gesetzt und die Komponente aktiviert.

Die Komponente bewegt nun das Objekt zum Target.

Ist es angekommen, deaktiviert sie sich selbst.

 

Ganz nach dem KISS-Prinzip würde ich mal behaupten. :D

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi.

Oder Du machst es Dir ganz einfach und gibst deinem Objekt noch einen bool als Bedingung mit, ob dieser das Ziel erreicht hat oder nicht. In deinen Skripten, wie sie jetzt sind, sagst Du ja nur das sich was bewegen soll.

 

Hier mal grob niedergeschrieben(Achtung, kann Fehler enthalten):

 

//Code1:
bool zielerreicht;
bool ObjectMoveRequest;

void Update(){

if(zielerreicht == false && ObjectMoveRequest == true){
  float step = speed * Time.deltaTime;
  gegenstandA.transform.position = Vector3.MoveTowards(gegenstandA.transform.position, newVector3(gegenstandA.position.x, gegenstandA.transform.position.y, gegenstandA.position.z), step);
}
}

//Code2:
if (Input.GetKeyDown(KeyCode.E)) {
  if(scriptA.zielerreicht == false){
  scriptA.ObjectMoveRequest= true;
}else{
		   scriptA.ObjectMoveRequest= false;
		}
}else{
  scriptA.ObjectMoveRequest= false;
}

 

Das Objekt, oder was auch immer registriert, dass das Fahrzeug das Ziel erreicht hat, setzt den bool: zielerreicht auf true.

Das lässt sich sicher auch eleganter lösen, nur bräuchte man da noch paar Infos.

Zumal hat das nach meiner Einschätzung mit "Wie programmiere ich Trigger/ Events" wenig zu tun.

 

MfG Felix

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...