Jump to content
Unity Insider Forum

Hide Enemy in nem Action Realtime Strategie Game


Peanut

Recommended Posts

Hey Leute ich mache ein kleines Multiplayer ARTS  Game und sitze gerade vor dem Problem wie ich es lösen kann das sich die Gegnerischen Einheiten erst ab einer bestimmten Distanz sehen können. Über Layers aber muss man da nicht zu viele Layer hinzufügen?

Danke für die Hilfe :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ne, viele Layer helfen da nicht. Ist aber so oder so keine ganz triviale Aufgabe. Du hast ja eine potentiell große Menge eigener Einheiten, die das Sichtfeld aufspannen, und mindestens eine gleich große potentielle Menge gegnerischer Einheiten, die jederzeit sichtbar oder unsichtbar werden können.

Der ganz naive Ansatz wäre daher, in regelmäßigen Abständen (muss ja nicht bei jeden Update sein, kann auch seltener oder konsistenter sein) den Abstand von jeder deiner Einheiten zu jeder gegnerischen zu messen und entsprechend die Sichtbarkeit umzuschalten. Das kannst du zwar sogar machen, indem du Gegner auf einen "Unsichtbar"-Layer schiebst... kannst aber auch einfach den Renderer deaktivieren. Das Problem an diesem Ansatz ist, dass der Rechenaufwand exponentiell steigt. Für jede neu gebaute eigene Einheit muss jede existierende gegnerische Einheit also eine Abstandsmessung mehr machen. Bei 20 gegen 20 bist du also bei 20*20 = 400 Berechnungen, bei 30 gegen 30 bist du schon bei 30 * 30 = 900... 50% mehr Einheiten auf beiden Seiten, aber mehr als doppelt so viele resultierende Berechnungen. Das System skaliert also sehr schlecht nach oben hin. Und darum wird die ganze Sache knifflig.

Bessere Ansätze bedeuten, dass du dir eine Beschleunigungsstruktur besorgst. Die kannst du dir entweder selber bauen, was eine sehr lehrreiche Sache wäre (kann ich deshalb mal empfehlen), oder du probierst, das zu nutzen, was PhysX (bzw. Box2D) dir mitgibt. Letzteres würde bedeuten, dass du deinen eigenen Einheiten SphereCollider gibst (CircleCollider2D wäre besser, ist aber vermutlich anstrengend umzusetzen, wenn deine Grafik 3D sein sollte). Diese Collider sind auf einem speziellen Layer (damit man ausschließlich gegen diese Gruppe checken kann), und alle gegnerischen Einheiten schauen, ob sie sich in einen solchen Collider hinein- oder hinausbewegen, um sich dann entsprechend sichtbar oder unsichtbar zu machen. Diesen Chack kannst du mit z.B. mit CheckSphere oder einem eigenen Collider machen.

Ich denke, die Lösung mit der eingebauten Physikengine kann ganz gut funktionieren, aber nicht selten ist es schwierig, diese Gesamtpakete auf kleinere Jobs zu beschränken. Wenn da unvorhergesehene Probleme auftreten, die sich nur schwer lösen lassen... oder wenn die Performance am Ende nicht so gut ist wie erhofft, dann muss man da etwas selber bauen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also ich mache solche wiederkehrenden Distanzmessungen immer so das ich die nur alle X Frames überprüfen. Wie oft das hängt vom Spiel ab und wie schnell das erfolgen muss. In dem Beispiel wird nur bei jedem 5. Frame gemessen.

private int distanceCheckInterval = 5

private void Update() {
  if (Time.frameCount % distanceCheckInterval == 0) {
      // Distanz messen

      // Gegner anzeigen bei entsprechender Distanz
  }
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wenn du jeden 5. Frame alle Checks machst, weil deine Framerate ansonsten spürbar runterginge, dann ist ja trotzdem jeder 5. Frame länger als die anderen. Dann hast du eine insgesamt höhere Framerate, aber die ist dafür dann nicht mehr gleichbleibend... das finde ich als Spieler ehrlich gesagt immer noch schlimmer :( 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Da hast du Recht. 😉 

Das ist bei mir aber nicht der Fall. Ich mache das nur um allgemein Sachen nicht öfters laufen zu lassen als nötig. Wenn so etwas meine FPS runter ziehen würde, dann würde ich das mit dem C# Job System machen, denn das ist genau für solche Sachen gemacht. Immer wieder das gleiche machen in hoher Anzahl. 😊

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...