Jump to content
Unity Insider Forum

Unterschied zwischen Runtime und Buildtime


chrische5

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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  

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...