chrische5 Geschrieben 23. Juni 2020 Melden Share Geschrieben 23. Juni 2020 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 More sharing options...
Sascha Geschrieben 23. Juni 2020 Melden Share Geschrieben 23. Juni 2020 Hab da was für dich: http://blog.13pixels.de/2019/things-that-can-make-a-difference-in-unitys-play-mode-compared-to-your-build/ Vielleicht ist da ja deine Antwort dabei. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
chrische5 Geschrieben 23. Juni 2020 Autor Melden Share Geschrieben 23. Juni 2020 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 More sharing options...
Sascha Geschrieben 23. Juni 2020 Melden Share Geschrieben 23. Juni 2020 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 More sharing options...
Zer0Cool Geschrieben 23. Juni 2020 Melden Share Geschrieben 23. Juni 2020 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 More sharing options...
chrische5 Geschrieben 24. Juni 2020 Autor Melden Share Geschrieben 24. Juni 2020 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 More sharing options...
chrische5 Geschrieben 24. Juni 2020 Autor Melden Share Geschrieben 24. Juni 2020 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 More sharing options...
Zer0Cool Geschrieben 24. Juni 2020 Melden Share Geschrieben 24. Juni 2020 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 More sharing options...
Sascha Geschrieben 24. Juni 2020 Melden Share Geschrieben 24. Juni 2020 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. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
chrische5 Geschrieben 24. Juni 2020 Autor Melden Share Geschrieben 24. Juni 2020 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 More sharing options...
Zer0Cool Geschrieben 24. Juni 2020 Melden Share Geschrieben 24. Juni 2020 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 More sharing options...
chrische5 Geschrieben 25. Juni 2020 Autor Melden Share Geschrieben 25. Juni 2020 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 More sharing options...
Zer0Cool Geschrieben 25. Juni 2020 Melden Share Geschrieben 25. Juni 2020 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? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
chrische5 Geschrieben 25. Juni 2020 Autor Melden Share Geschrieben 25. Juni 2020 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 Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
chrische5 Geschrieben 25. Juni 2020 Autor Melden Share Geschrieben 25. Juni 2020 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 More sharing options...
chrische5 Geschrieben 25. Juni 2020 Autor Melden Share Geschrieben 25. Juni 2020 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 More sharing options...
chrische5 Geschrieben 25. Juni 2020 Autor Melden Share Geschrieben 25. Juni 2020 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 More sharing options...
Zer0Cool Geschrieben 25. Juni 2020 Melden Share Geschrieben 25. Juni 2020 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. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
chrische5 Geschrieben 26. Juni 2020 Autor Melden Share Geschrieben 26. Juni 2020 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 More sharing options...
Zer0Cool Geschrieben 26. Juni 2020 Melden Share Geschrieben 26. Juni 2020 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 More sharing options...
chrische5 Geschrieben 26. Juni 2020 Autor Melden Share Geschrieben 26. Juni 2020 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 Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 26. Juni 2020 Melden Share Geschrieben 26. Juni 2020 Ja, das kann gut sein. Schieß mal einen Raycast von der Position der Kamera ab (in Richtung des GO) und schau was sie trifft... 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.