gombolo Geschrieben 2. Januar 2021 Melden Share Geschrieben 2. Januar 2021 Hallo zusammen, es ist jetzt 9Minuten nach 24Uhr. Die beste Zeit für Programmiere Ich habe mir eine kleine Funktion gebastelt. Diese skaliert ein 3D Model abhängig von der Fenstergröße. Funktioniert auch sehr gut zu meiner Überraschung. Nur habe ich folgendes Problem. Ich muss in der Update() Methode den Wert abfragen... ...ganz am Anfang lass ich die maximale Ausweitung in X und Y rechnen -> in einer eigenen Klasse!. Diesen Wert benötige ich für die Skalierung. Ich könnte jetzt diese Kalkulation kopieren und in jede Klasse packen bei der ich ein Objekt skalieren will, aber das möchte ich nicht. Soll doch ein eleganter Code werden. Meine Frage -> Wie bringe ich Unity dazu...diese eine Klasse und genau diese Methode als erstes auszuführen damit die Werte auch allen anderen Objekten zur Verfügung stehen? Geht das überhaupt? Danke für Eure Mühe...Grüße Gombolo Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
gombolo Geschrieben 2. Januar 2021 Autor Melden Share Geschrieben 2. Januar 2021 Ich habe das mal so gelöst -> private void OnEnable() { StartCoroutine(WaitCalcAdjustment()); } private IEnumerator WaitCalcAdjustment() { while(!Adjustment.Instance) { yield return new WaitForEndOfFrame(); } if (Adjustment.Instance) { fBegrenzungX = Adjustment.Instance.maxX; fBegrenzungY = Adjustment.Instance.maxY; } } Ich warte praktisch bis die Instanz auch existiert... Sollte es bessere Ideen geben....nur her damit Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 3. Januar 2021 Melden Share Geschrieben 3. Januar 2021 Was du da tust, ist eine mögliche Variante. Wenn etwas nicht von Anfang an da sein kann, wartest du bis es da ist. Die anderen beiden grundsätzlichen (!) Varianten sind Dafür sorgen, dass Dinge rechtzeitig da sind (ich weiß, ist stumpf). Lazy Initialization. Über Variante 1 hast du sicherlich längst nachgedacht, aber vielleicht hab ich noch etwas für dich. Je nach dem, was du da genau machst. Kennst du z.B. das Attribut [RuntimeInitializeOnLoadMethod]? Das kannst du über eine statische Methode packen. Unity führt diese Methode dann gleich zum Spielstart aus, vor allen Awakes, OnEnables und Starts. Und dafür muss auch kein Objekt in der Szene sein. Damit geht unglaublich viel, sodass man irgendwann einfach quasi keine GameObjects mehr braucht, die beim Initialisieren unbedingt vorhanden sein müssen. Sprachen laden, Input-System initialisieren und vieles mehr. Keine Ahnung, ob das was für dich ist. Lazy Initialization bedeutet, dass ein Objekt sich gar nicht erst die Mühe macht, sich zu initialisieren... bis jemand was von ihm will. Stell dir einen Mitarbeiter vor, der solange auf dem Schreibtisch döst, bis er hört, dass die Chefin den Gang runterkommt - und dann wird schnell der Arbeitsordner aufgemacht. Geht auch schön einfach. Statt Dinge in z.B. Start oder Awake zu initialisieren baust du eine Initialisierungsmethode, die immer auf Anfrage ausgeführt wird: private bool initialized = false; private int _number; public int number { get { if (!initialized) Initialize(); return _number; } } private void Initialize() { _number = 42; initialized = true; } Die Property "number" ist natürlich ein bisschen Syntax-Zucker, kann man auch anders machen. Der Kern ist: Wenn irgendein Code die Nummer haben will, wird geschaut, ob diese schon initialisiert ist, und wenn nicht, wird initialisiert. Beide Varianten funktionieren nur, wenn der Kontext auch passt. Wenn die Daten erst dann da sind, wenn sie da sind (z.B. weil sie aus dem Internet heruntergeladen werden), dann wird das z.B. nix mit lazy. Ich schreibe das jetzt aber nicht, weil deine Lösung schlecht ist oder so. Die ist schon gut so Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
gombolo Geschrieben 3. Januar 2021 Autor Melden Share Geschrieben 3. Januar 2021 Hey danke für die Erklärung...bringt mir echt viel. Wir wohl noch eine Weile dauern bis ich alles beherrsche 😁 Finde scripting sooo spannend 😁 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.