Hi, ich will Tagesabläufe für Npcs machen weiß aber nicht ob ich Targetpoints oder Spline verwenden soll. Kommt man eigentlich an Splines vorbei? weil nur mit Target Points werden kurven in Wegen ja garnicht gegangen...irgendwie fehlt mir die grundsätzliche differenzierung was man wann verwendet sollte
Npc Tagesabläufe
- hgcnnhgfds
- Erledigt
-
-
-
Ich weiß nicht, ob es eine modernere Methode gibt. Aber, ich kenne es so, dass du Wege gewichten kannst, anhand des Untergrundes. Zum Beispiel ist ein gepflasteter Weg leichter begehbar als ein Trampelpfad und der ist wiederum leichter zu begehen als ein normales Feld.
Ich habe das in der Praxis zwar noch nie selber gemacht, aber so kenne ich das halt. Und wenn du das machst, dann sucht sich der NPC ganz automatisch den leichtesten und besten Weg, der anhand der Daten begehbar ist. Vorteil gegenüber Splinverfolgung, du kannst den NPC überall hinsetzen und er findet immer wieder den Weg zurück. Bei Splines müsstest du die ja überall händisch zeichnen.
Wahlweise hätte ich da noch die Idee einer Kombination. Der NPC klinkt sich in die Spline von den Wegen ein. Er muss dann nur noch die nächstgelegene Spline von einem Weg suchen, sich dort "einklinken" und folgt dann dem Weg anhand der Spline. Nachteil, wer wird stur der Spline folgen und niemandem ausweichen oder so. -
Was hast du denn genau vor?
Im Grunde ist alles möglich, Und auch eine Kombination.
Eine Spline kannst du ja auch aus Target Points berechnen.
Bei einer Spline hast du in der Regel einen Start- und einen Endpunkt. Der Charakter bewegt sich auf einem Zahlenwert zwischen 0 (Anfang) und 1 (Ende). Die Länge einer Spline kannst du berechnen und daraus z. B. auch berechnen, wie lange etwas braucht.
Eine kleine Anregung:
In vielen Spielen wie z. B. Die Siedler sieht man Männchen, die etwas von A nach B tragen.
Hier könnte man denken, dass eine Animation läuft und wenn diese zu Ende ist, dem Lager beispielsweise 100 Lehm gutgeschrieben werden.
Aber so funktionieren Spiele in der Regel nicht. Das wäre viel zu rechenintensiv.
Hier wird beispielsweise die Länge der Spline berechnet und daraus die benötigte Zeit bestimmt. Dem Lager werden dann nach z. B. nach 30 Sekunden 100 Lehm gutgeschrieben.
Die Charakteranimation ist hierbei nur eine Visualisierung des Timers.
Beispiel: Eine Spline ist 10 Meter lang.
- 0 Sekunden: 0 Meter
- 15 Sekunden: halbe Strecke
- 30 Sekunden: Ziel erreicht → 100 Lehm werden gutgeschrieben
Auf diese Weise wird alles korrekt berechnet, selbst wenn der Charakter blockiert wird. Oder wenn du beispielsweise 1 Million Erzteile auf einem Fließband transportieren lässt.
Entscheidend ist die Zeit bzw. der zugrunde liegende Simulationswert, nicht die Animation.
Wenn du das per Target machst und dein Rechner hängt oder der Charakter kommt aus einem Grund nie am Ziel an das Lehm einfach verpuffen.
Versuche das immer zu berechnen und die Berechnung zu Visualiseren statt Berechnungen von Animationen abhängig zu machen.
Ich hoffe du verstehst was ich meine
-
Ja, es kommt natürlich darauf an, welche Art von Spiel es werden soll. Bei den Siedlern, ja, da sind die Animationen ein besserer Fortschrittsbalken. Bei Spielen wie Gothic (Remake), oder ähnlichen Spielen, oder kurz Rollenspielen, wo die NPCs einen geregelten Ablauf haben, zur Arbeit gehen, essen gehen, zur eigenen Hütte/ins Bett gehen usw., gibt es einen ganzen Mix an Techniken.
Zum Beispiel, wenn der NPC außer Sichtweite ist, dann braucht er gar keine Wege entlanggehen, dann muss per Berechnung nur festgestellt werden, wo er in etwa zu welcher Zeit ist, falls der Spieler ihm auf dem Weg irgendwo begegnet. Wenn er in Sichtweite ist, kann er auch Navigationspunkten folgen. Das wäre ein Netz von Punkten, zum Beispiel an jeder Kreuzung, wo grob die Navigation berechnet, was der beste Weg ist. Dann die Gewichtung von Wegen oder Splinekopplung, damit er halt dem Weg folgt. Bei Gefahr kann er die Spline auch kurzfristig verlassen, um sich zu verteidigen, in dem Moment folgt er ja eh nicht mehr seinem Tagesablauf.
Also es gibt wirklich zig Möglichkeiten der Umsetzung und eine Reihe von Kombinationsmöglichkeiten. Man müsste da mal erörtern was passend ist und gut umsetzbar.
Zum Beispiel kenne ich das noch aus ganz früheren Zeiten, da gab es noch so Soundmaps, bestehend aus verschiedenen Farben, wo die Map nachgezeichnet wurde mit Wegen und verschiedenen Bodenbeschaffenheiten, Also Blau gepflasterter Weg, Rot Matsch, Gelb Sand oder was auch immer, anhand dieser Map konnten dann verschiedene Schrittgeräusche dargestellt werden. Ich weiß zwar nicht, ob das noch geht, ob es das überhaupt noch gib, das war irgendwann in den 90ern, aber sowas könnte man zum Beispiel bei einfachen Spielen auch für die Gewichtung der Pfade nehmen. Wäre aber wohl etwas sehr veraltete Technik. -
Ich mein, ich will ein Dorf mit 40-50 Npcs eine Tagesroutine geben. So viel ich weiß, geht dass nur über Splines, dann muss man aber richtig viele Punkte in der Spline machen allein wegen der Z Dimension, weil der Boden uneben ist und den Npc sonst fliegt oder in der Erde ist, weil der NPC Boden nicht erkennt. Oder es geht über Nav Mesh, dann ist das aber viel Performancefressender...was würde ein Kommerzielles Studio machen?
Oder um meine Frage simpler zu machen: Wenn ich 50 NPC habe in einer Stadt, die Für 24 Stunden vertreilt pro Npc ungefähr 5 verschiedene Stationen durchlaufen. sagen wir 1. Arbeit. 2. Essen 3. Arbeit 4. Lagerfeuer 5. Haus. Wäre das zu viel performanceverbraucht wenn ich Navmesh benutze? Dabei würde dann insgesamt pro Aktion 5 seperate Berechnungsanfragen gemacht werden, für jeden Splinepunkt eine. Kann man das machen? -
Bei einer Engine wird in der Regel nur das berechnet, was der Player tatsächlich sieht.
Nehmen wir mal GTA 5.
Eine riesige Welt, aber diese Welt ist nicht immer vollständig aktiv. In GTA laufen vermutlich hunderte NPCs durch die Stadt, vielleicht sogar mehr.
In Unreal gibt es verschiedene Techniken, die man verwenden kann, um solche Dinge zu realisieren.
Eine davon ist das Camera Occlusion Culling.
Das COC (Camera Occlusion Culling) ist eine Technik, die standardmäßig aktiviert ist. Sie blendet im Grunde alles aus, was du als Player nicht siehst, und blendet das ein, was ins Bild kommt.
Sprich: Alles, was du nicht siehst, wird ausgeblendet. Es macht auch keinen Sinn, etwas anzuzeigen bzw. zu berechnen, was man nicht sieht. Warum sollte man beispielsweise etwas berechnen, das sich hinter dir befindet?
Der Trick – und so musst du das auch aufbauen – ist, dass du immer nur das darstellst, was der Player tatsächlich sieht.
Das heißt aber auch, dass du bestimmte Dinge berechnen musst, obwohl du sie nicht siehst.
Ich gebe dir mal ein Beispiel, wie ich mir das vorstelle:
Du hast 50 NPCs, die unterschiedliche Interessen haben.
Zum Beispiel der Bäcker:
ErArbeitet in der Bäckerei, läuft von seinem Wohnhaus zur Bäckerei, läuft von der Bäckerei zum Brunnen, um Wasser zu holen, und geht nach der Arbeit in die Taverne und betrinkt sich dort.
Usw. Im Grunde kann jeder NPC seine eigenen Points of Interest (POIs) haben.
Diese POIs können auch zufällig sein und sich während der Spielzeit verändern.
Ich würde die Splines bei Spielbeginn generieren, also während der Ladezeit. Anschließend würde ich die Länge der Splines berechnen. Bei Animationen auf Splines gibt es in der Regel eine Interpolationsmöglichkeit von 0 bis 1.
Dein Player startet bei 0 und läuft die Spline ab, bis er 1 erreicht hat.
Je nach Länge der Spline braucht dein Charakter beispielsweise 2 Minuten.
Nach einer Minute hat er also den Wert 0,5 auf der Spline erreicht.
Du brauchst zunächst gar keinen Charakter. Stattdessen simulierst du das alles nur durch Berechnungen.
Statt eines Charakters würde ich jetzt einen kleinen Würfel verwenden. Die Position, an der sich der Würfel auf deiner Spline befindet, wird berechnet.
Anschließend setzt du den Würfel auf die entsprechende Position der Spline.
Verstehst du?
Du lässt nicht einfach die Spline ablaufen, damit anschließend etwas passiert, sondern du simulierst das alles als reine Berechnung in einem Array zb.
Das ist wichtig, damit nicht 50 Charaktere berechnet werden müssen, die du überhaupt nicht sehen kannst.
Nun bewegen sich erstmal nur 50 NPCs virtuell irgendwelche Splines entlang.
Jetzt würde ich beim Player prüfen, welche Splines sich in seiner Nähe befinden. Die Splines, die sich in der Nähe des Players befinden, würde ich einblenden und auch die dazugehörigen Würfel anzeigen.
Nun prüfst du:
Wenn der Player in Richtung des Würfels schaut, blendest du den Charakter ein.
Solche Berechnungen passieren innerhalb eines Frames. Das heißt, als Player siehst du den Würfel nicht – du siehst direkt den NPC.
Was im Endeffekt passiert:
Du kennst jederzeit die Position des Würfels auf einer Spline von 0 bis 1. An dieser Position wird dann entweder der Würfel oder der eigentliche Charakter platziert.
Es muss nur das angezeigt werden, was der Player auch wirklich sieht.
Du kannst die Splines auch ingame verändern. Beispielsweise könntest du alle 5 Sekunden prüfen, ob sich an den Splines etwas verändert hat, und entsprechend darauf reagieren.
Ich würde außerdem darauf achten, dass nicht zu viele NPCs gleichzeitig an einem Punkt stehen.
Ich denke so kannst du auch mehr wie 50 NPCs einblenden. Bringe noch LODs mit rein um den Polycount mehrer NPCs zu drücken.
Du kannst ja auch mal ein Test machen. Lasse mal 50 NPCs in einem Level um einen bestimmten Punkt laufen und stelle dich als Charakter in die Mitte und schau wie es läuft und wie sich die FPS verändern wenn du einen nach dem anderen einblendest. So findest du die maximale Anzahl an NPCs die man als Player gleichzeitig sehen kann.
-
Ich möchte noch ergänzen, wie die Berechnungen ablaufen können.
1. Spiel startet.
2. Der Bäcker läuft von seiner Wohnung zur Bäckerei. Du rechnest die Länge der Spline in Zeit um und weißt, dass der Bäcker 2 Minuten bis zur Bäckerei braucht.
3. Dein Spiel läuft 2 Minuten. Der Bäcker ist in der Bäckerei angekommen und produziert ab jetzt Brot.
Nach 2 Minuten Spielzeit beginnt der Timer für die Brotproduktion.
Das Brot ist nach einer Minute fertig. Nach 3 Minuten Spielzeit wird also 1 Brot gutgeschrieben.
Auf diese Weise passiert alles zeitgesteuert, ohne dass sich die Charaktere tatsächlich bewegen müssen. Das kostet dich nahezu keine Performance, weil alles über Berechnungen bzw. Blueprints läuft.
Erst wenn der User den Weg des Würfels kreuzt bzw. in dessen Nähe kommt, wird der Charakter als tatsächlicher NPC eingeblendet.
Ich würde folgendermaßen vorgehen:
1. Generiere per Blueprint zwei Punkte.
2. Generiere eine Spline und verbinde die beiden Punkte miteinander.
3. Rechne die Länge der Spline in Zeit um.
4. Generiere weitere Punkte und Splines und lasse dir die berechneten Werte per Print anzeigen.
Du brauchst dafür zunächst keinen Charakter.
5. Teste das Ganze anschließend mit Würfeln, die die Splines abfahren. Vernachlässige dabei zunächst Hindernisse und die eigentliche Wegberechnung.
6. Teste das Ganze anschließend mit echten Charakteren.
Blende, wie oben bereits beschrieben, alle paar Sekunden einen weiteren Charakter ein und beobachte dabei die Performance.
Ich würde die Charaktere außerdem zunächst etwas schneller laufen lassen, als du sie später tatsächlich laufen lassen möchtest – vielleicht doppelt so schnell.
Dadurch erzeugst du bewusst eine höhere Performancebelastung und hast später einen gewissen Puffer, wenn die Charaktere mit normaler Geschwindigkeit laufen.
-
Du brauchst gar nicht so viele Splinepunkte. Du kannst die ID eines Splinepunktes auch auslesen und deinen NPC mit MoveTo zu diesem laufen lassen, per Navmesh. Du hängst also nicht wirklich in der Spline. So hast du recht kurze Navmeshabschnitte, das braucht dann nicht ganz so viel Ressourcen. Nachteil, an den Navpunkten kann es etwas hakelig wirken, weil die natürliche Kurve der Spline verloren geht und er sich quasi auf dem Splinepunkt zum nächsten dreht.
-
Spilne ist doch nur eine 3d vektorkurve wie ein pfad in illustrator oder corel draw. Die interpolation gibt doch an wie weich die Kurve wird.
Kennt ihr noch NURBS?- non uniform rational b splines? also Vektorflächen? Hat sich nicht durchgesetzt obwohl es sicher gut war.
-
Spilne ist doch nur eine 3d vektorkurve wie ein pfad in illustrator oder corel draw. Die interpolation gibt doch an wie weich die Kurve wird.
Kennt ihr noch NURBS?- non uniform rational b splines? also Vektorflächen? Hat sich nicht durchgesetzt obwohl es sicher gut war.
Ganz so ist es nicht, aber ich verstehe, was du sagen willst.
Der kürzeste Weg zwischen zwei Punkten ist immer die direkte Verbindung. Du setzt zwei Punkte, verbindest sie und dein Charakter braucht z. B. 1 Minute, um den Pfad abzulaufen. Der Pfad ist beispielsweise 10 Meter lang.
Wenn du mehr Punkte in den Pfad einfügst, hat deine Spline nicht automatisch weiterhin eine Länge von 10 Metern. Entscheidend ist, wie diese Punkte miteinander verbunden werden.
Wenn dein Pfad geschwungen ist und beispielsweise vier Punkte enthält, läuft der Charakter diese Punkte auf dem direktesten Weg entlang.
Durch die Kurven kann der Pfad insgesamt länger werden und der Charakter braucht entsprechend mehr Zeit.
Wenn du diese vier Punkte nun weiter interpolierst, bleiben deine vier Basispunkte erhalten, aber der Verlauf zwischen diesen Punkten wird durch zusätzliche Berechnungspunkte bzw. eine glattere Kurve smoother.
Je nachdem, wie die Spline berechnet wird, kann sich dadurch die tatsächlich zurückzulegende Strecke verändern. Umso stärker bzw. feiner die Kurve aufgelöst wird, desto genauer lässt sich ihre tatsächliche Länge bestimmen.
Die Interpolation selbst macht die Spline aber nicht automatisch länger – entscheidend ist der tatsächliche Kurvenverlauf.
Die Frage ist also:
Was willst du erreichen?
Wenn du den Pfad veränderst, ihn länger machst oder zusätzliche Wegpunkte einfügst, kann dein Charakter länger brauchen, um das Ziel zu erreichen.
Wenn er beispielsweise etwas transportiert, wird dadurch auch der Transportweg länger.
Willst du, dass ein Brot nach genau 2 Minuten im Ziel gutgeschrieben wird, kannst du die Geschwindigkeit des Charakters entsprechend anpassen, sodass er nach 2 Minuten am Ziel ist.
Und genau das ist die Frage, wie man es aufbauen will. Das Ergebnis wird jedenfalls jedes Mal anders sein, wenn sich der Pfad verändert.
Darum würde ich, wie gesagt, immer die Spline-Länge berechnen und die Länge der Spline in eine benötigte Zeit umrechnen.
Mehr Interpolation bzw. eine höhere Auflösung der Kurve bedeutet nicht grundsätzlich, dass der Charakter mehr Zeit braucht. Wenn sich dadurch aber der tatsächliche Kurvenverlauf bzw. die zurückzulegende Strecke verändert, wird die Animation entsprechend länger. Dafür ist die Bewegung dann smoother.
Kennt ihr das Spiel Timberborn? Hier gibt es ganz viele Biber, die Dinge von A nach B transportieren. Man kann das Spiel pausieren und alle Biber bleiben stehen.
Man kann einen Weg abreißen und die Biber, die bereits auf diesem Weg unterwegs sind, laufen zunächst trotzdem weiter. Erst die nächsten Biber nehmen einen anderen Weg.
Hier dürfte bei jedem Biber, der spawnt, ein eigener Weg bzw. eine eigene Wegreferenz erstellt werden.
Wenn ein Biber unterwegs stirbt, darf die Ware natürlich niemals am Ziel ankommen.
Man kann z. B. über einen Boolean steuern, ob ein gespawnter Biber lebt oder tot ist. Er trägt beispielsweise 100 Eisen. Wenn er stirbt, werden diese 100 Eisen gelöscht und niemals dem Lager gutgeschrieben.
Wenn du das Spiel pausierst, hältst du die Bewegung auf der Spline einfach an. Jeder Biber bleibt an seiner Position auf der Spline, beispielsweise als Wert von 0 bis 1. Diese Position kannst du speichern und nach dem Fortsetzen wieder verwenden.
-
Alles anzeigen
Ganz so ist es nicht, aber ich verstehe, was du sagen willst.
Der kürzeste Weg zwischen zwei Punkten ist immer die direkte Verbindung. Du setzt zwei Punkte, verbindest sie und dein Charakter braucht z. B. 1 Minute, um den Pfad abzulaufen. Der Pfad ist beispielsweise 10 Meter lang.
Wenn du mehr Punkte in den Pfad einfügst, hat deine Spline nicht automatisch weiterhin eine Länge von 10 Metern. Entscheidend ist, wie diese Punkte miteinander verbunden werden.
Wenn dein Pfad geschwungen ist und beispielsweise vier Punkte enthält, läuft der Charakter diese Punkte auf dem direktesten Weg entlang.
Durch die Kurven kann der Pfad insgesamt länger werden und der Charakter braucht entsprechend mehr Zeit.
Wenn du diese vier Punkte nun weiter interpolierst, bleiben deine vier Basispunkte erhalten, aber der Verlauf zwischen diesen Punkten wird durch zusätzliche Berechnungspunkte bzw. eine glattere Kurve smoother.
Je nachdem, wie die Spline berechnet wird, kann sich dadurch die tatsächlich zurückzulegende Strecke verändern. Umso stärker bzw. feiner die Kurve aufgelöst wird, desto genauer lässt sich ihre tatsächliche Länge bestimmen.
Die Interpolation selbst macht die Spline aber nicht automatisch länger – entscheidend ist der tatsächliche Kurvenverlauf.
Die Frage ist also:
Was willst du erreichen?
Wenn du den Pfad veränderst, ihn länger machst oder zusätzliche Wegpunkte einfügst, kann dein Charakter länger brauchen, um das Ziel zu erreichen.
Wenn er beispielsweise etwas transportiert, wird dadurch auch der Transportweg länger.
Willst du, dass ein Brot nach genau 2 Minuten im Ziel gutgeschrieben wird, kannst du die Geschwindigkeit des Charakters entsprechend anpassen, sodass er nach 2 Minuten am Ziel ist.
Und genau das ist die Frage, wie man es aufbauen will. Das Ergebnis wird jedenfalls jedes Mal anders sein, wenn sich der Pfad verändert.
Darum würde ich, wie gesagt, immer die Spline-Länge berechnen und die Länge der Spline in eine benötigte Zeit umrechnen.
Mehr Interpolation bzw. eine höhere Auflösung der Kurve bedeutet nicht grundsätzlich, dass der Charakter mehr Zeit braucht. Wenn sich dadurch aber der tatsächliche Kurvenverlauf bzw. die zurückzulegende Strecke verändert, wird die Animation entsprechend länger. Dafür ist die Bewegung dann smoother.
Kennt ihr das Spiel Timberborn? Hier gibt es ganz viele Biber, die Dinge von A nach B transportieren. Man kann das Spiel pausieren und alle Biber bleiben stehen.
Man kann einen Weg abreißen und die Biber, die bereits auf diesem Weg unterwegs sind, laufen zunächst trotzdem weiter. Erst die nächsten Biber nehmen einen anderen Weg.
Hier dürfte bei jedem Biber, der spawnt, ein eigener Weg bzw. eine eigene Wegreferenz erstellt werden.
Wenn ein Biber unterwegs stirbt, darf die Ware natürlich niemals am Ziel ankommen.
Man kann z. B. über einen Boolean steuern, ob ein gespawnter Biber lebt oder tot ist. Er trägt beispielsweise 100 Eisen. Wenn er stirbt, werden diese 100 Eisen gelöscht und niemals dem Lager gutgeschrieben.
Wenn du das Spiel pausierst, hältst du die Bewegung auf der Spline einfach an. Jeder Biber bleibt an seiner Position auf der Spline, beispielsweise als Wert von 0 bis 1. Diese Position kannst du speichern und nach dem Fortsetzen wieder verwenden.
Das scheint mir wertvoll aber ich glaub ich meinte einfach nur Spline Kurven und nicht Pfade.
Erinnerst Du Dich noch darn wie ich meinte das ich nie ein Problem beim Umstieg auf ne neue Engine Version hatte? Das war auch so und nur kleine Änderungen haben die Levels wieder kompatibel gemacht. Ich hatte aber nie probiert das Projekt zu verpacken, ich dachte wenns im Editor läuft wirds auch als exe laufen. Dem ist nicht so ^^, genau diese Engine Konvertionen verursachen beim packen massive Fehler. Hätt ich mal besser zugehört.
Mir geht auch Tomarrs Vorschlag echtzeit Lichtquellen für Projektile zu verwenden immer wieder durch den Kopf. Wie kann der auf so ne verrückte Idee kommen, der is doch komplett wahnsinnig.
Gut, wenn ichs von Anfang an richtig aufgebaut hätte wäre vielleicht sogar das möglich.
Naja, soweit hab ich die optimierung von 30fps medium auf 40fps episch einstellungen gebracht. Interessanterweise warn gar nicht die Nanite Landschaften ressourcenfressend sondern use simple as komplex kollisonsmodell bei Hintergrundgrafiken die eigentlich gar keine Kollision brauchen. Niagra hat sich auf meinem alten PC auch als schwierig herausgestellt, möglich das das an meiner PS4 artigen alten Hardware liegt aber allein das löschen von bewegten Niagra Effekten hat im medium grafik setting 20 fps gebracht.