Jump to content
Unity Insider Forum

Image blinken lassen


Vanles

Recommended Posts

Hallo Leute,

ich würde gern die Grafiken von meiner Lebensanzeige kurz für 2 Sec. blinken lassen
und dann dauerhaft erscheinen. 

Erklärung: Der Spieler muss Ballons fangen, für jeden nicht gefangenen Ballon erscheint 
dann eine Grafik. 

Das Anzeigen der Grafiken klappt schon, nur das mit dem blinken will einfach nicht so recht. 
Hab dazu eine Coroutine erstellt, die im Update dann aufgerufen wird. Anfänglich funktioniert
es auch, aber weil die IF Abfrage nach dem ersten mal immer wieder durchlaufen
wird, weil erstens das Bild dann true ist und zweitens die  Postion auch größer als 0 ist. 
Kurz gesagt, die Grafiken flackern dann nur noch hin und her. 

Habt Ihr eine Idee wie ich das Problem lösen kann ?
 

public int Position;
    public playerControll Player;



    // Update is called once per frame
    void Update()
    {


        if (!GetComponent<Image>().enabled && playerControll.leben >= Position)
        {
          
           StartCoroutine(BlinkText());  
            
           //  Images Anzeige ohne blinken 
           // GetComponent<Image>().enabled = true;
     

        }

           
    
	}


	public IEnumerator BlinkText()
	{

		for (int i = 0; i < 3; i++)
		{
            GetComponent<Image>().enabled = false;
			yield return new WaitForSeconds(0.3f);
			GetComponent<Image>().enabled = true;
			yield return new WaitForSeconds(0.3f);
		}
       
      

	}



 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also ich würde das ja mit der UI machen und einfach nur die Sichtbarkeit des Colorkanals animieren. Aber egal.
Was bei dir passiert ist folgendes:

Du fragst ab ob die Grafik nicht enabled ist und ob Leben >= Position. (was das mit dem Leben bedeutet, weiß ich nicht)

Ja und wenn dieses so ist, dann startest du die Coroutine.
Jetzt ist es aber so, dass in der Coroutine erst nach 0.3 Sek. die Grafik auf true gesetzt wird. Das bedeutet, dass innerhalb dieser 0.3 Sekunden zig mal deine Update ausgeführt wird und dann auch zig mal deine Coroutine gestartet wird. Bei einer Framerate von 60fps wird die Coroutine also rund 20 Mal aufgerufen und erst dann ist ändert sich die Grafik auf enabled. Erst jetzt ist deine Bedingung für das Starten der Coroutine nicht mehr da!
Trotzdem arbeiten 20 Coroutinenzyklen weiter! und nach weiteren 0.3 Sekunden ist die Bedingung zum Sprung in die Coruoutine wieder erfüllt und nun wird wieder jedes Frame in die Coroutine gesprungen.

Verstehste?

Du brauchst also eine weitere oder andere Variable, die du für die Bedingung zum Start der Coroutine nutzen musst.
Entweder setzt du eine zusätzliche Variable "einmalig" von irgendwoher auf true (z.B. in dem Moment wenn ein Balloon nicht gefangen wurde), die dann gleich beim Aufruf der Coroutine wieder auf false gesetzt wird. Die könnte starteBlinken heissen und deine if Abfrage müsste dann nur starteBlinken abfragen. Ein weiterer Balloon würde diese Variable wieder auf true setzten können.
Oder du setzt eine Variable beim Start der Coroutine auf true (z.B. coroutineGestartet), die du natürlich in deiner If Abfrage mit einbauen musst.
Diese Variable wird erst am Schluß der Coroutine wieder auf false gesetzt. Die Startbedingung muss aber in der Abarbeitungszeit wieder zurück genommen werden.

Du brauchst also für beide Möglichkeiten eine Bedingung um die Coroutine zu starten. Diese Bedingung wird von der Coroutine selber ( oder in der If Abfrage beim Start der Coroutine) wieder genommen. Eine Positions-Unterschiedsabfrage ist eigentlich nicht gut, denn da der Balloon sich ja bewegt, bleibt die Bedingung so lange bestehen, bis der Balloon wieder auf der anderen Seite ist. Im ersten Fall wird die Bedingung wie ein Trigger einmalig gesendet, im zweiten Fall muss die Bedingung wieder zurück genommen werden, bevor die Coroutine beendet ist. Z.B. beim zerstören des Balloons.
 

In beiden Fällen solltest du aber nicht den Zustand des Herzens abfragen, denn der ist nicht wichtig für deine Bedingung und ändert außerdem beim Blinken jedes Mal seinen Zustand. Wichtig ist nur, dass der Balloon nicht gefangen wurde und dass die Coroutine noch nicht gestartet wurde. 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

bool BlinkTextDone = false;

void Start() {
  Image m_Image = GetComponent<Image>();
}

  // Update is called once per frame
    void Update()
    {

      if (!m_Image.enabled && playerControll.leben >= Position)
         {
            if (!BlinkTextDone && !IsInvoking("BlinkText"))
            {
                InvokeRepeating("BlinkText", 0.3f, 0.3f);
                Invoke("StopBlinkText", 2.0f);
            }
         }
     }

    void BlinkText()
    {
        m_Image.enabled = !m_Image.enabled;
    }

    void StopBlinkText()
    {
        CancelInvoke("BlinkText");
        BlinkTextDone = true;
        m_Image.enabled = true;          
    }          

Ob deine Startbedingung oben stimmt, kann ich nicht sagen (die Abfrage, ob das Image sichtbar ist sollte stimmen, wenn das Image am Anfang deaktiviert ist). Wenn du diese wegnimmst, dann sollte das Bild (nach Instanziierung) 2 Sekunden lang blicken und dann dauerhaft zu sehen sein.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor einer Stunde schrieb malzbie:

@Zer0Cool: Nicht immer alles vorprogrammieren. Die Leute sollen doch was lernen und vorallem verstehen.

Ja, das stimmt, aber wenn es schnell geht. Sonst haben wir wieder einen Thread mit 20 Posts und 10 Nachfragen ;)  Zudem muss er den Code ja nun auch erst einmal verstehen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Leute, 
vielen dank für die Hilfe. 

Ich kann euch eins sagen das ich durch das vorprogrammieren und die Beispiele die ich von euch bis
jetzt bekommen habe, sehr schnell lerne und es auch verstehe. Ich kann ein Buch lesen und verstehe
nichts und nach 3-4 Beispielen habe ich es dann verstanden.

Malzbie, aber dank dir für die tolle Erklärung.. wie gesagt hat mir alles sehr geholfen.
Ich bin auf jeden fall sehr Danke für eure Unterstützung.


Gruß
Marco
 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...