Jump to content
Unity Insider Forum

[Execution Order Problem]2 Objekte machen im selben Frame ein Raycast und laufen danach ineinander


Thariel

Recommended Posts

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

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

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

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

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

Archiviert

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

×
×
  • Neu erstellen...