Jump to content
Unity Insider Forum

Eine Methode in einer Klasse als erstes ausführen


Recommended Posts

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 to post
Share on other sites

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 to post
Share on other sites

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 :)

  • Thanks 1
Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...