Jump to content
Unity Insider Forum
Sign in to follow this  
chrische5

Unterschied zwischen Runtime und Buildtime

Recommended Posts

Hallo

Ich habe mal wieder Tomaten auf den Augen. Ich habe ein GO (eine Kiste) mit einem Script, welches den Cursor ändert, wenn die Maus über dem GO ist:

private void OnMouseEnter()
{
    Cursor.SetCursor(_onObjectCursor.value, Vector2.zero, CursorMode.Auto);
}

private void OnMouseExit()
{
    Cursor.SetCursor(_normalCursor.value, Vector2.zero, CursorMode.Auto);
}

Das ging mal gut, aber ich habe die GO aus der Szene gelöscht und dann aus dem prefab ordner wieder hinzugefügt und nun geht es nicht mehr - keine Ahnung warum. Wenn ich nun aber zur Laufzeit das gleiche prefab in die Szene ziehe, fuktioniert das gnaze auf einmal: der Cursor wird geändert. 

Ich habe auch noch ein anderes Script auf dem GO, welches auf die Maus regaiert. Da ist es das gleiche: Wenn ich es zur Buildtime in der szene habe, geht nix, wenn ich es zur runtime hinzufüge, klappt es. kennt das jemand? gibt es dafür eine erklärung?

 

Danke

Christoph

Share this post


Link to post
Share on other sites

Hallo

Ich bin mit den Begrifflichkeiten noch nicht so fest. Ich befinde mich im PlayMode. Den habe ich als Runtime bezeichnet. Bei deinem Artikel geht es ja um den endgültigen Build, oder?

Bei mir macht es einen Unterschied, ob ich die Kiste vor dem Drücken von Play oder danach in die Szene ziehe..

 

Christoph

Share this post


Link to post
Share on other sites

Hast Recht, darum geht's im Artikel, aber gerade der erste Punkt gilt auch im Play Mode. Wenn dein Objekt zusammen mit einem anderen Objekt zu Beginn der Szene existiert, dann ist unklar, wer von beiden zuerst Awake, OnEnable oder Start aufgerufen kriegt. Wenn du ein Objekt erst später instanzierst, dann ist klar, dass es später drankommt. In gefühlten 90% der Fälle ist diese nicht definierte Reihenfolge der Grund für unterschiedliche Ergebnisse unter mehr oder weniger gleichen Bedingungen.

Hast du ansonsten irgendwelche Fehlermeldungen in den Momenten, wo es nicht funktioniert?

  • Like 1

Share this post


Link to post
Share on other sites

Ah  es liegt daran (ich hatte mich auch erst gewundert), dass der Fenster-Focus auf dem Game View sein muss :) 

Den Fokus kannst du setzen, indem du 1x in die Gameview klickst.

Wenn du den Focus wieder auf der SceneView hast, dann werden Maus-Eingaben nicht mehr an die Gameview gesendet und der Cursor verändert sich auch nicht mehr (alle OnMouseXXX-Methoden werden nicht mehr durchlaufen).

Share this post


Link to post
Share on other sites

Hallo

 

@Zer0Cool: Entweder verstehe ich nicht genau, was du meinst oder der Fall liegt anders. Ich versuche es mal zu erklären: Ich habe auf einer Tilemap einige GO. Manche davon verändern den Mauszeiger, wenn die Maus über ihm ist (ganz, wie du es mir empfohlen hast). Das funktioniert super. Und funktionierte auch für Kisten. Wenn ich jetzt eine Kiste (die ein prefab ist) platziere und dann Play drücke, ändert sich der Mauszeiger auf einmal über der Kiste nicht mehr. Bei den anderen GO bleibt das Verhalten aber wie gewünscht. Nur die Kiste macht nix und der auch der breakpoint in OnMouseEnter wird erreicht. Bei den anderen GO aber schon (es handelt sich um das gleiche script). Wenn ich im PLayMode eine Kiste in die Szene ziehe, dann wieder in den Gameview wechsele, wird bei der gerade hinzugefügten Kiste der Mauszeiger geändert und bei der alten nicht. Die anderen GO funktionieren weiterhin einwandfrei.

Das ist mir rätselhaft. Ich werde nachher mal noch das von Sascha lesen und versuchen, zu verstehen...

 

Christoph  

Share this post


Link to post
Share on other sites

Hallo

 

@Sascha: Aus meiner Sicht gibt es bei mir dieses Problem nicht. Es gibt keine Abhängigkeiten und das entsprechende Script ist wirklich ausgesprochen übersichtlich:

 

 

public class ChangeMouseCursor : MonoBehaviour
    {
        [ShowInInspector]
        [SerializeField] 
        private GlobalTexture2D _normalCursor = default;
        
        [ShowInInspector]
        [SerializeField] 
        private GlobalTexture2D _onObjectCursor = default;

        private void Awake()
        {
            if (!_onObjectCursor.value)
            {
                throw new Exception("OnObjectCursor not setted");
            }

            if (!_normalCursor.value)
            {
                throw new Exception("ONormalCursor not setted");
            }
        }

        private void OnMouseEnter()
        {
            Cursor.SetCursor(_onObjectCursor.value, Vector2.zero, CursorMode.Auto);
        }

        private void OnMouseExit()
        {
            Cursor.SetCursor(_normalCursor.value, Vector2.zero, CursorMode.Auto);
        }
    }
}

 

Es gibt auch keinerlei Fehlermeldungen oder ähnliches.

 

Christoph

Share this post


Link to post
Share on other sites

Wird denn die OnMouseEnter() Methode erreicht (Debug.Log einbauen)?

So mögliche Ursachen das es nicht geht, musst du alles mal überprüfen:
- Fenster hat kein Focus
- GO wird durch ein anderes GO verdeckt (die Erkennung geht immer vom Bildschirm aus über den Mauszeiger durch die Szene)
- GO hat kein Collider
- GO Collider ist aus
- GO ist deaktiviert
- SetCursor-Methode wird zwar aufgerufen aber tut nix (Frage siehe oben)

Share this post


Link to post
Share on other sites

Sieht für mich stark danach aus, dass eine der Exceptions fliegt, weil eine der GlobalTexture2Ds keinen Wert hat. @Zer0Cool hat Recht - versuche Mal, das Problem einzugrenzen. Entweder mit Debug.Logs oder dem Debugger.

Share this post


Link to post
Share on other sites

Hallo

Es fliegt keine Exception und die GlobalTexture2D sind zugeordnet. Ich habe sie mal anderen GO zugewiesen und da klappt es.

1. Fenster hat Fokus. Ich bewege mich ja durch klicken

2. GO wird nicht überdeckt - ich sehe es ja (-:

3. GO hat einen BoxCollider

4. der ist an - ich kann auch nicht durch die Kiste durchlaufen

5. OnMouseEnter wird nur bei der Kiste nicht erreicht. Das gleiche Script hängt auch an anderen GO und da wird es erreicht.

 

Ich bin echt planlos. Und immer noch: Wenn ich die Kiste zur Laufzeit klone, funktioniert alles, wie gehabt.

 

Christoph

Share this post


Link to post
Share on other sites

Ich denke nicht das es am Skript liegt (da ist kein Fehler drin), wenn er nicht in die OnMouseEnter-Methode reingeht, dann arbeitet der Collider der am GO hängt nicht wie er soll.  Ich würde die  Prefab der Kiste mal komplett neu erstellen:
-  leeres GO erzeugen
- MeshFilter (+ Mesh) einfügen
- MeshRenderer (+ Material) einfügen
- und Box-Collider einfügen 
- (evtl noch Animation dran wenn brauchst)
und sonst nix und dann mal schauen, ob des nun funktioniert

Schau auch mal auf den Layer des Objektes das der sich nicht "verstellt" (Layer können den Raycast deaktivieren ist aber schon weit hergeholt).

Share this post


Link to post
Share on other sites

Hallo

 

So langsam wird es komisch. Ich habe das nun mal komplett neu gemacht. Sprite in die Szene gezogen und boxcollider2d . Das funktioniert. Ich kann nicht durchlaufen und auch die wegfindung erkennt die Box als Hindernis. Nun hänge ich nur das Script dran und er springt nicht in die onmouseenter Funktion. Natürlich nur bei der Kiste. Das gleiche Script auf anderen go funktioniert... 

 

Christoph 

Share this post


Link to post
Share on other sites

Kannst du aus der "defekten Kiste" mal ein Asset-Export machen und mir schicken? Vielleicht kann ich es nachvollziehen ...
bzw. ziehe dieses Asset mal in eine leere Szene und arbeitet es da wie es soll?

Share this post


Link to post
Share on other sites

Hallo

 

Eine leere Szene habe ich noch nicht probiert. Das mache ich wahrscheinlich heute Abend und sende dir dann auch das entsprechende asset. Kann auch morgen werden, mal sehen, wie Kinder schlafen... 

 

Danke für eure Geduld. 

Christoph 

Share this post


Link to post
Share on other sites

Hallo

 

Irgendwie spinnt was total. Ich habe die Kiste nun mal in einer anderen Szene probiert und es pasiert wieder nix. OnMouseEnter wird nicht erreicht. Zum Testen habe ich auch mal ein anderes Prefab, welches in der ersten Szene funktioniert, in der neuen Szene getestet und wieder: nix. Ich hänge jetzt mal Kiste hier dran, hoffe sie ist zum Anschauen fertig (ich habe noch nie was exporteirt) und hoffe vor allem, dass ich nicht total was übersehen habe...

 

Christoph

chest.unitypackage

Share this post


Link to post
Share on other sites

Hallo

 

Jetzt habe ich was komisches entdeckt und das scheint das Problem zu sein. Die "alten" GO haben einen negaitiven z-Wert (sind aber trotzdem zu sehen - keine Ahnung, warum) und die gehen alle. Wenn ich neue im Nichtplaymode einbaue, haben die Z-Wert von 0, so wie das eigentlich auch will. Die gehen dann nicht.

Wenn ich allerdings im Playmode GO ins die Szene ziehe, haben die auch z-Wert 0 und gehen trotzdem....ahhhh

 

Christoph

Share this post


Link to post
Share on other sites

Hallo

Die Erkenntnisse nehmen zu: Ich benutze teilweise Peek zum Platzieren der GO. Dabei bekommen diese immer einen negativen Z-Wert, obwohl im Prefab 0 steht. Wenn ich ohne Peek platziere, ist der Wert für z 0. Jetzt habe ich alle GO erneut gelöscht und eine mit Peek und eine normal platziert und nun gehen beide. Ich habe nix!!! am Prefab geändert. Entweder ist das ein komischer Bug oder ich mache was sehr falsch. (wobei ich eine Vermutung habe...😃)

 

Christoph

Share this post


Link to post
Share on other sites

Ich habe auch gerade ein seltsames Verhalten. Ich benutze auch gerade die OnMouseXXX-Methoden und wenn ich ein GO in der Scene per Code verschiebe lösen die Methoden auch nicht mehr aus. Das GO ist bei mir ein Child ob es damit was zu tun hat who know.

Share this post


Link to post
Share on other sites

Hallo

Es scheint irgendwie mit der z-Achse zu tun zu haben. Als ich jetzt gerade startet, funktionierte nur die Kiste mit dem negativen Wert (gestern gingen noch beide und ich habe nix geändert.) Jetzt habe ich zum Spaß mal die z-Werte der Kisten geändert (also dort negativ, wo es vorher nicht ging und dort 0, wo es vorher ging) und siehe da: jetzt ist das Verhalten andersherum.

 

Christoph

Share this post


Link to post
Share on other sites

Vielleicht trifft der "Maus-Raycast" (was anderes machen die OnMouseXXX-Methoden ja nicht) die Objekte mit dem negativen Z-Wert nicht ....
Auch der Abstand der Kamera zu den Objekten den der Maus-Raycast treffen soll muss stimmen, zudem darf das Objekt auch nicht verdeckt sein.

Sollten die Probleme anhalten vielleicht doch einen eigenen Raycast in der Fixed-Update-Methode erzeugen. Hier kann man über die Layermask die zu erkennenden Objekte einschränken und der Raycast wird auch durch andere Objekte nicht geblockt. Ich bin aber nicht ein Freund davon in der Fixed-Update-Methode solche Dinge zu tun, nur wenn es gar nicht anders geht (zumal Unity es ja sowieso schon macht um die OnMouseXXX-Methoden zu bedienen). Für mich ist eine Faustregel für eine gute Performance die Unity-Events zu verwenden und die Update-Methode nur fürs Abfragen der Spielereingaben (oder Objekte die wirklich in jedem Frame bewegt werden müssen hier dann aber auch in einer "Controllerklasse" die alle GOs bewegt und nicht jedes GO mit seiner eigenen Updatemethode). 
 

Share this post


Link to post
Share on other sites

Hallo

 

Es werden nur die Objekte mit negativem z-Wert getroffen...

 

Idee, die ich gerade nicht überprüfen kann: Die Kamera ist auf der falschen seite der Szene und deswegen "verdeckt" die Tilemap die Objekt mit z-wert 0. kann das sein?

 

Christoph

Share this post


Link to post
Share on other sites

Ja, das kann gut sein. Schieß mal einen Raycast von der Position der Kamera ab (in Richtung des GO) und schau was sie trifft...

Share this post


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...
Sign in to follow this  

×
×
  • Create New...