Jomnitech Geschrieben 24. Juni 2018 Melden Share Geschrieben 24. Juni 2018 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 More sharing options...
Damon93 Geschrieben 24. Juni 2018 Melden Share Geschrieben 24. Juni 2018 du könntest das ganze mit dem Observer pattern machen. Google mal nach UniRx. damit sollte es gehen. Im großen und ganzen musst sich die klasse welche wissen möchte ob sich der bool ändert zu beginn auf des bool subscriben. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Jomnitech Geschrieben 24. Juni 2018 Autor Melden Share Geschrieben 24. Juni 2018 @Damon93 Bin mir nicht sicher ob das nicht ewas op ist, aber werd mich mal reinlesen ob das für mich als nooby was taugt. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 24. Juni 2018 Melden Share Geschrieben 24. Juni 2018 @Damon93s Vorschlag ist schon genau richtig, dafür braucht man ein Observer Pattern. Aber, um die Frage nochmal direkt zu beantworten: Änderungen Monitoren ohne dass man die Variable in einen Wrapper packt ist nicht möglich. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Mr 3d Geschrieben 24. Juni 2018 Melden Share Geschrieben 24. Juni 2018 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 More sharing options...
Jomnitech Geschrieben 24. Juni 2018 Autor Melden Share Geschrieben 24. Juni 2018 vor 12 Minuten schrieb Mr 3d: bool wert; bool lastWert; void Update(){ if(wert != lastWert){ //geändert lastWert = wert; } } Das funktioniert einwandfrei, vielen herzlichen Dank. @Mr 3d Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 24. Juni 2018 Melden Share Geschrieben 24. Juni 2018 Ja gut, wenn man das in jedem Frame prüfen will. Ist aber keine schöne Lösung. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Damon93 Geschrieben 26. Juni 2018 Melden Share Geschrieben 26. Juni 2018 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 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 More sharing options...
Mr 3d Geschrieben 26. Juni 2018 Melden Share Geschrieben 26. Juni 2018 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 More sharing options...
Jomnitech Geschrieben 26. Juni 2018 Autor Melden Share Geschrieben 26. Juni 2018 @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 More sharing options...
Sascha Geschrieben 27. Juni 2018 Melden Share Geschrieben 27. Juni 2018 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 More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.