Jump to content
Unity Insider Forum

Boolean als Trigger (gelöst)


Jomnitech

Recommended Posts

Kann man eine Abfrage machen, welche prüft ob eine Booleon ihren Wert geändert hat um damit eine Fuktion auszulösen? Was ich so bei Google gefunden habe funktioniert nicht so wie ich mir das vorstelle.
Sollte so sein das es nicht spamt, sondern nur einmal getriggert wird in dem Frame wo der Wechsel stattfindet.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Normalerweise speichert man doch einfach den letzten Status der Variable und überprüft im nächsten Update ob er immer noch gleich ist..

oder hab ich die Frage falsch verstanden? ^

bool wert;
bool lastWert;

void Update(){
 if(wert != lastWert){
  //geändert
  lastWert = wert;
 }
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Zumal ja deine Aussage war @Jomnitech dass es nicht spammen soll. 

Genau das macht aber die Update Funktion :) Diese wird jeden Frame aufgerufen, selbst wenn du in der Update Methode kein bisschen Code stehen hast. Solltest du nun diverse Klassen haben die eine Update Funktion besitzen kann es unter Umständen je nachdem für was für ein Endgerät du entwickelst zu leichten bis starken Performance Problemen kommen.

Um nicht zu spammen kommst du um ein Observer Pattern nicht drumm rum. Das klingt auch nur am Anfang etwas OP ist es jedoch gar nicht :D 

Also höre auf @Sascha wenn er sagt das es keine schöne Lösung ist :) 

Am besten gewöhnst du dir von Anfang an nen guten Stil an!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Am 24.6.2018 um 21:15 schrieb Sascha:

Ist aber keine schöne Lösung.

Observer Pattern hatten wir letztes Jahr in der Schule angesprochen, aber nie implementiert..

 

Ich bin jetzt spontan auf das hier gekommen:

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

public struct Boolean {

    private bool _Value;
    public bool Value {
        get { return _Value; }
        set { 
            if(_Value != value)
            {
                _Value = value;
                if (OnValueChanged != null)
                {
                    OnValueChanged();
                }
            }
        }
    }

    public event Action OnValueChanged;
}

public class BooleanObserver : MonoBehaviour{

    public Boolean myTestBool;

    private void Awake()
    {
        myTestBool.OnValueChanged += boolChanged;
    }

    private void Update()
    {
        myTestBool.Value = Input.GetKey(KeyCode.Space);
    }

    private void boolChanged()
    {
        Debug.Log("Bool changed!");
    }
}

Das scheint ganz gut zu funktionieren, aber ist es auch eine korrekte Anwendung des Patterns? ^

Link zu diesem Kommentar
Auf anderen Seiten teilen

@Damon93

Werde ich mich auf allefälle mal reinlesen. Wie gesagt, bin ich noch Neuling, und habe noch nie etwas mit coden am Hut gehabt, deswegen bin ich auch froh um eure Tipps.
Zum prototypen tuts aber manchaml auch eine unschöne Lösung, wenn man nur schnell testen möchte ob das so hinhaut wie man es sich vorstellt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 12 Stunden schrieb Mr 3d:

Das scheint ganz gut zu funktionieren, aber ist es auch eine korrekte Anwendung des Patterns? ^

Klar. Ein Observer muss nicht unbedingt ein Objekt sein, das ein bestimmtes Interface implementiert oder so. Ein beobachtbares Ding (in diesem Fall dein Boolean) informiert zu bestimmten Ereingnissen (Wert-Änderungen) beliebige Objekte, die nichts mit der Klasse zu tun haben. Beobachtermuster! :)

Ich würde höchstens empfehlen, die Klasse umzubennenen. Du könntest die Klasse auch generisch machen und ObservableValue<T> nennen, sofern es dich nicht stört, dass man eine zusätzliche Klassendefinition braucht, um das Feld serialisieren zu lassen.

Persönlich bin ich auch kein Fan von Events, weil jeder Hannes durch falsche Zuweisung (= statt +=) erstmal alle anderen Systeme kaputt machen kann.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...