Thariel Geschrieben 23. Juni 2019 Melden Share Geschrieben 23. Juni 2019 Hi Ich habe folgendes Problem: Auf jedem Feld des Schachbrettartigen Spielfeldes darf immer nur ein Npc stehen. Wenn 2 Npc darauf warten, das selbe Feld zu betreten und das Feld frei wird, dann testen beide Npc's gleichzeitig im selben Frame mit einem Raycast, ob es frei ist. Es ist auch frei und beide ziehen auf das selbe Feld, doch jetzt stehen 2 Npc's auf dem selben Feld, weil die zwei Raycasts und die Bewegung der Collider jeweils Parallel ablaufen (Execution Order). Die Bewegung findet mit transform.Translate statt. Wie könnte ich das Problem lösen? Danke schon mal 😅 Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 23. Juni 2019 Melden Share Geschrieben 23. Juni 2019 Der gesamte Mono-Teil (also der C#-Teil) deines Projekts ist single threaded, sofern du nicht ECS nutzt. Das heißt, dass deine Raycasts nicht gleichzeitig ablaufen, sondern der eine immer vor dem anderen. Man könnte z.B. den Collider direkt auf das freie Feld schieben und die Animation auf den sichtbaren Teil des Objekts beschränken, damit der nächste Raycast direkt den Collider des anderen NPCs trifft. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Thariel Geschrieben 23. Juni 2019 Autor Melden Share Geschrieben 23. Juni 2019 Genau so mache ich das auch! Das Problem ist aber: 1. Frame: Beide NPC's warten darauf, dass das Feld frei wird. 2. Frame: Das Feld wird frei. 3. Frame: -> Npc 1 macht Raycast. Feld ist frei. Bewegt sein Collider auf das neue Feld (Physik wird aber erst im nächsten 4. Frame vor Update() ausgeführt). -> Npc 2 macht Raycast. Feld ist frei (Collider von Npc 1 noch nicht eingetroffen). Bewegt sein Collider auf das angeblich freie Feld. 4. Frame: Noch vor Update() werden die Collider bewegt, mit dem Ergebnis, dass jetzt beide auf dem selben Feld sind. So verstehe ich das zumindest... oder funktioniert es anders? 🤔 Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Jomnitech Geschrieben 23. Juni 2019 Melden Share Geschrieben 23. Juni 2019 Der Raycast läuft doch auch über die Physik?🤔 Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Thariel Geschrieben 23. Juni 2019 Autor Melden Share Geschrieben 23. Juni 2019 Also ich gehe davon aus, dass in Update() den Code der Reihe nach in allen Objekten ausgeführt wird und in "Internal physics update" Kollision und so weiter berechnet wird. https://docs.unity3d.com/Manual/ExecutionOrder.html Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Jomnitech Geschrieben 23. Juni 2019 Melden Share Geschrieben 23. Juni 2019 Trotzdem ist er ja physic basiert, da wird das nicht viel machen wenn er in der Update function drin ist. Aber warum führst du den raycast nicht in der fixedupdate function aus, dann läuft das ja immer mit der Physik. Du könntest den Raycast sogar in eine eigene Update Function einfügen die sogar noch langsamer läuft, dann hast du ev. den nötigen delay den du brauchst um den NPC zu bewegen. Kann mir kauf vorstellen das es nötig ist jeden Frame zu prüfen ob ein Feld frei ist? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 23. Juni 2019 Melden Share Geschrieben 23. Juni 2019 Ach, die Geschichte... Richtig. @Thariel Du hast natürlich Recht: Ein bewegtes GameObject ist nicht sofort an seiner neuen Position, sondern erst nach Ende des Frames. Da ein verschobenes Objekt letztendlich einiges mehr an Konsequenzen nach sich zieht, als man erwartet, arbeitet Unity alle Änderungen in der Szene in einem Rutsch ab. Dadurch müssen Dinge nicht doppelt und dreifach gemacht werden, wie es der Fall wäre, wenn diese Dinge nach jeder Transform-Änderung gemacht würden. In deinem Fall ist das natürlich schlecht. Du kannst diese Änderungen aber manuell auslösen, und zwar mit Physics.SyncTransforms. Das rufst du einfach nach dem Verschieben auf. Damit umgehst du zwar diese Optimierung, die es nicht ohne Grund gibt, aber wie immer gilt: Performance ist erst dann ein Thema, wenn es zum Problem wird. Optimalerweise würdest du dir eine eigene Datenstruktur bauen, die das Feld repräsentiert, und das ganze nicht über die Physik-Engine machen, aber wenn dein Spiel nicht zu groß ist, ersparst du dir mit dieser Methode einiges an Ärger. @Jomnitech Er löst den Raycast in Update aus - das heißt nicht, dass er das jeden Frame macht. FixedUpdate ändert hier auch nichts. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Jomnitech Geschrieben 23. Juni 2019 Melden Share Geschrieben 23. Juni 2019 vor 2 Minuten schrieb Sascha: Er löst den Raycast in Update aus - das heißt nicht, dass er das jeden Frame macht. FixedUpdate ändert hier auch nichts. Dann hab ich das falsch verstanden, danke. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Thariel Geschrieben 24. Juni 2019 Autor Melden Share Geschrieben 24. Juni 2019 Cool, vielen Dank! Ich überlege mir noch, wie ich es dann genau löse 😃 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.