Beiträge von Exaran

    Wie kann man eigentlich den Tastenbefehl und den Namen von einem Enhanced Input Action erhalten?


    Es gibt das get davon aber nur als Bool. Da müsste normal der "Key" und "KeyName" sein, damit man entsprechend diese Information weitergeben kann. Diese brauche ich um im Spiel sichtbar zu machen mit welcher Taste man was machen kann. Aber das gibt es nicht :(

    Es gibt ein "InputActionObjectReference" der das Action Description beinhaltet, aber dafür gibt es wiederum kein Anschluss :(

    Ok hat sich erledigt.


    Der Fehler lag darin das "AiPerception Component" in meinem MyCharacter (Blueprint Actor) war (was auch die Spielfigur ist). Nun habe ich diese separat in den AiControllerClass umgelegt und nun erscheint auch nicht mehr der Fehler.


    Falls das jemand wissen möchte. :)

    Noch eine Frage zu einem anderen Thema, zu dieser Fehlermeldung:

    "LogAIPerception: Warning: UAIPerceptionComponent::OnRegister: Perception Component is being registered with Haendler_C_UAID_2CF05D835792F79F01_1473419535, they are designed to work with AAIControllers!"



    Ich verstehe diesen Fehler nicht.

    Die "Heandler" NPCs haben einen AiController, sonst würden die nicht funktionieren, trotzdem erscheint die Fehlermeldung das kein AiController vorhanden ist.
    Überprüft habe ich es, alle NPCs haben einen AiController.


    Hat da jemand eine Idee dazu?

    Ahoi zusammen!

    Habe mein Quest System überarbeitet und muss nun das Datum einbauen.

    Das Problem ist das Unreal Engine irgendwie nicht Datisch denken kann.


    Siehe Bild:


    Problem:
    Heute ist der 10.10.2023

    Mache ich ähnlich wie im Bild +21 bei Day, wird das Datum entsprechend auf den 31.10.2023 gesetzten. Es funktioniert also fehlerfrei!

    Jedoch bei +22 wird nicht 01.11.2023 gesetzt, sondern 01.01.001 (fehlerhaft).


    Also kurz gesagt, die Unreal Engine kann irgendwie nicht die Monate umschalten. Daher die Frage wie man das tut.


    Danke für eure Infos!

    Ist das ganze mit viel Aufwand verbunden, also ein Häkchen irgendwo setzten und gut ist oder muss das ganze sehr intensiv eingepflegt und aktualisiert werden.?

    Hi zusammen!


    Ich stoße sehr häufig auf Situationen in der ich über einen Delay oder anderes... falsch weiterführen muss.


    Damit meine ich etwa als Beispiel: (Es gibt unzählige andere Beispiele in der überprüft werden muss ob die Aktion wirklich ausgeführt wurde.)

    Wenn die Spielfigur durch den Start-Teleporter läuft und auf der anderen Seite am Ziel-Teleporter ankommt, soll ein Sound abgespielt werden.

    Leider geht das ganze aber nur mit einem (nicht optimal) Delay, weil der Sound laut dem Script-Ablauf vorher abgespielt wird, als der Charakter dort im Multiplayer ankommt. Es geht darum das man am Teleporter hören soll ob da etwas ankommt oder nicht, also nicht bei dem Client (als 2D sound).

    Also die Zeit Verzögerung wann der Charakter dort tatsächlich ankommt ist unbekannt (abhängig von der Internetverbindung, von der Rechenleistung ((also wann der Char wirklich da ist))).

    Das bedeutet ich bräuchte irgendwas womit ich überprüfen kann ob etwas (eine Art Bremse) tatsächlich da ist, wo es sein soll. Es könnte ja sein das der Character erst nach 10 Sekunden dort ankommt (weil der PC noch so lange laden muss oder warum auch immer).


    Ich hoffe ihr versteht was ich damit meine.


    Das ganze nur über einen möglichen Delay laufen zu lassen ist eine Katastrophe!



    Das Problem habe ich überall in der ich nicht überprüfen kann ob das gewünschte auch tatschlich ist.

    Z.B. ob die Waffe nun ausgerüstet ist (wegen Delay usw.), da kann es passieren das die Ausrüstungsanimation früher erfolgt als diese sollte.

    So, habe es nun endlich hinbekommen das die Stacks entsprechend bei dem Herstellen von Gegenständen korrekt abgezogen (ReverseForEachLoop sei Dank!).

    Dachte schon ich müsste das ganze abbrechen und für die erste Vorstellung des Spiels im Video irgend eine Mogelei einbauen damit das nicht auffällt... aber es geht wunderbar!


    Bisher zwar nur einfach, also ohne Berücksichtigung der Qualitäten (wobei es nicht nur die Qualitäten sondern auch die Inhalte ((Namen, Beschreibung, Zugehörigkeiten)) sind).

    Also wenn Eisenbarren "Made in Sonstwo" sind, werden diese separat gestapelt, unabhängig von der Qualität. Die Qualität hat mehr die Auswirkung auf die effektive Haltbarkeit und den Bruchwert des Gegenstandes. Mindere Qualität sorgt dafür das die Waffe weniger aushält und schneller dauerhaft kaputt geht. Um das mal für den Anfang primitiv einfach zu halten.


    Jetzt muss ich das ganze noch für den Spielerhandel, für die Quest-Belohnung usw. machen.

    Dazu muss ich noch ein System machen bei dem es unregelmäßig das Inventar aktualisiert und gegeben falls die Gegenstände neu zusammen stapelt. Nicht das irgendwann mal 1x, 1x, 1x, 1x,1x, Eisen habe usw., obwohl man das ganze stapeln könnte.



    Habe das ohne ein Schatteninvenar gemacht, weil man zugleich auch als fremde Person das Inventar einer anderen Person manipulieren kann. Sonst kommt das ganze System zu sehr durcheinander. Auf ein Drag&Drop habe ich bisher noch verzichtet (auch wenn es bequemer wäre), aber das ganze Inventar wird sowieso noch mal in der Zukunft erweitert, angepasst und vielleicht abgeändert.


    So Sachen wie das stecken von Materialien in die Materialslots (Werkbank usw.) oder das aneinanderreihen der Materialien in der Richtigen Position, um unterschiedliche Dinge herstellen zu können... das wäre schon geil, aber das schaffe ich derzeit alleine nicht.


    Vielen Dank an euch allen für die Informationen!

    Manchmal ist das ganze echt so undurchsichtig wie man diverse Dinge am sinnvollsten einbauen soll. Das Inventar + die damit zusammenhängen sind ja essentiell für jedes Spiel.

    Also deine maximale Stapelgröße darf in dem Fall natürlich nicht kleiner sein, als die Stapelgröße, die dein Rezept benötigt. Es sei denn du hast, ähnlich wie in Minecraft, einen Craftingtable, in den du größere Stacks reinpacken darfst.

    Ansonsten, nimm dein Schatteninventar zur Berechnung, welches halt nicht in Stacks aufgeteilt ist.

    Du meinst von 3x10 Eisen in 1x30 Eisen umwandeln für die Berechnung der Kosten? Dann wieder zurück in 3x10 Eisen (als Beispiel).

    Speichere doch die Gesamte Menge und nicht jeden Stapel einzeln.


    Wenn du im Widget das Inventar abfragt, kannst du die Anzahl Stapel ausrechnen und den Rest auf den letzten Stapel verteilen.


    Was doch eigentlich zählt ist die gesamtmenge.

    Bitte erneut lesen, habe es gerade in dem Augenblick bearbeitet wo du was geantwortet hast ^^

    Ne nicht so ganz wie du meinst.


    Im Rezept habe ich die Gegenstände unabhängig ihrer Stapelgröße zusammengezählt, weil das so einfacher ist.

    Rezept (benötigt Gegenstände):

    1x 10 Eisen

    1x 3 Holz

    1x 2 Leder


    ---

    Im Inventar sind die Gegenstände aufgeteilt, jeweils in ihrer bis zu maximalen Stapelgröße.

    Inventar (Vorhanden):

    5x Eisen (5/5 Stack)

    5x Eisen

    8 Holz (8/10 Stack)

    1x Leder (1/1 Stack)

    1x Leder

    1x Leder


    Es scheitert daran das die Abfrage unterschiedlich ist, Rezept braucht als Beispiel 1x10 Eisen, im Inventar sind jedoch 2x5 Eisen vorhanden.


    Das Problem ist, ich müsste die ganzen gestapelten Gegenstände im Inventar wieder zusammen zählen. Sozusagen vom Inventar 2x5 Eisen zu nun 1x 10 Eisen. Damit ich diese 1:1 mit dem Rezept verrechnen kann.



    Bin mir nicht sicher ob ich das nun falsch mache, wenn ich Z.B. 5x 10 Eisen im Inventar habe (Also 5 Gegenstände im Array), anstatt 1x50 Eisen (mit einem Gegenstand im Array.)

    Das hatte ich zuvor, aber da wollte ich dies wiederum unterteilen in die Stapelgrößen, was wiederum dazu führte, das ich das direkt im Inventar Stapeln muss. Weil diese unterschiedliche Inhalte haben können.

    Es könnten z.B. Insgesamt 50 Eisen da sein, jedoch können davon wiederum 5 Eisen in schlechter Qualität, 10 in guter Qualität usw. sein. Das muss ich ja separat stapeln. Also brauche ich sozusagen ein System (was jetzt vorhanden ist), um die ganzen Sachen zu unterteilen.


    Später sollen auch Slot-Systeme hinzukommen, wozu ich dann sowieso dieses aktuelle Systeme brauche. Nur muss ich das ganze nun Gegenrechnen. Es sei denn ich bin auf dem Holzweg mit meinem Inventar-System und man macht das in der Spieleindustrie anders?

    Ich möchte gerne die Gegenstände zum Vergleich bei der Herstellung in ihrer Anzahl vergleichen, daher muss ich diese Gegenstände zusammenzählen.

    Egal was ich mache es kommt immer das falsche raus.
    Bei dem ADD-Unique Array wird auch das falsche ausgegeben.


    Brauche dringend eure Hilfe, es ist zum verzweifeln!


    Es ist so zum kotzen mit dem ganzen Inventar System, egal wie ich das mache und drehe ich stoße später immer auf logische Fehler.


    Kann dazu kein Script posten, weil es ja falsch ist.

    Habe dazu ein Zwischenspeicher Array erstellt in diesem sind die 3 Grundmaterialien gespeichert, diese sollen nur noch mit der Anzahl addiert werden.

    Das mit dem Streaming von Objekten und anderen Dingen (was auch immer), dient hauptsächlich dazu das der Server und der Client mit den ungebrauchten Dingen entlastet wird.

    Das ist die Idee des Streamings, dass nur Dinge gebraucht werden die auch tatsächlich gebraucht werden, alles andere fliegt sozusagen raus, wird irgendwo abgespeichert und bei bedarf wieder abgerufen.


    Ich habe das hier nur angesprochen, weil auch die Gegenstände die ich verwende, auch im Spiel/Welt verwendet werden und das System also ineinander greifen muss.

    Es würde wenig Sinn machen, wenn nur nicht interaktive Dinge gestreamt werden... dann liegt quasi der ganze interaktive Müll herum und verstopft den Client + Server. Ein häufiges Problem verschiedener anderer Multiplayer Spieler. Weshalb das ganze auch häufig limitiert ist.


    Wenn man sich dieses ganzen "Wundertechniken mit 1000 Spieler gleichzeitig" anschaut, erkennt man dazu parallelen. Diese bauen exakt auf diesem Prinzip auf wie ich oben geschrieben habe. Je weniger auf dem Server und Client an ungenutzten Dingen liegt, um so mehr Spieler können als Lückenfüller einspringen. Somit kann man die Spielerzahlen nach oben schrauben (auf kosten wiederum anderer Dinge, Balancing usw.).


    Man kann sich das so wie das alte LOD (Level of Detail) System bei der Grafik anschauen. Nur eben nicht für Grafik sondern für Netzwerkkommunikation.

    Die Client basierten Grafiken laufen lokal ab und dem Server ist das egal, dieser muss nichts grafisches berechnen. Der Server muss nur den Teilnehmern sagen wo was ist.


    ---


    Achja so nebenbei, habe es wunderbar hinbekommen wie ich es wollte. Siehe Screenshot.

    Also alles was Stapelbar und nicht ist (z.B. 2x 1 Säbel) funktioniert perfekt. Auch die Munition usw mit den unterschiedlichen maximalen Stapelgrößen. Das freut mich sehr.

    Jetzt noch die anderen Systeme daran anpassen und wunderbar.



    Am Anfang hatte ich das Inventar System so:

    10 Eisenbarren = 10 Gegenstände im Inventar.


    Das war zwar praktisch aber mir ist aufgefallen das wenn zu viele Gegenstände im Array sind (Anzahl) führt es zu Delay Problemen und allgemeine Fehler. Später sind Makros nicht mehr ausgeführt worden. Als ich 250x 1 Eisenbarren einfügen wollte, Unreal Engine hat es nicht gemacht :(



    Nun habe ich wie oben im Bild eine Stapelmenge die ich selbst bestimmten kann.

    z.B. 100 Eisenbarren = 1 Gegenstand im Inventar.

    oder 5x 20 Eisenbarren = 5 Gegenstände.


    Nun sind auch die Fehlermeldungen verschwunden das dass Array empty is usw.

    Das wundert mich etwas weil das Array nicht leer ist... komische Sache.

    Darum verstehe ich nicht warum die Fehlermeldung erscheint.




    Gedacht habe ich das so das Dinge in der Welt nur auf dem Server gespeichert werden, nach dem "Object-Streaming" Prinzip.

    Dinge im Spiel werden rein und raus gestreamt wenn diese nicht oder benötigt werden.


    Der erste Schritt dafür ist die Physik der Objekte nach einer Ruhephase deaktiviert werden, um so die Performance zu verbessern. Also diese werden zu temporär Statischen Objekten und dabei sollen auch die Informationen entfernt werden, bis diese wieder gebraucht werden. Etwa wenn sich ein Spieler einem gewissen Bereich nähert.

    Ich habe noch eine zusätzliche Frage:

    Bezüglich Multiplayer und Delay.


    Wie kann man das machen das eine Übertragung von Informationen dann erfolgt wenn es möglich ist ohne den Verlust durch Ping?


    Bezüglich dem "Inventar", benutze ich das Langschwert daraus muss im anderen "Ausrüstung-Inventar" (wo es hineingeführt wird) die Widgets aktualisiert werden. Da der Transfer von Server zu Server erfolgt, können keine Lokalen Widgets durchgeführt werden (es geht allgemein nicht). Setzte ich die Aktualisierung des "Ausrüstung-Inventar" an das Ende, so das es aktualisiert werden soll wenn alles andere davor erledigt wurde, funktioniert es nicht.

    Erst wenn ich ein Delay von 0,2 Sekunden davor hänge funktioniert es.


    Aber wenn einmal der Ping/Verzögerung größer ist, tritt der gleiche Fehler auf.

    Daher meine Frage wie kann man etwas Ausführen wenn es tatsächlich ausführbar ist?

    Ich habe das ganze so gemacht das ich mich auf eine Graphen-Datenbank hinarbeite. So das ich nur für die erste Gegenstandsart eine Datenbank brauche und alles weitere wird in sich selbst gespeichert, modifiziert und angepasst vererbt usw.. Man soll die Sachen im Spiel verändern können (innerhalb einer gewissen Möglichkeit) die wiederum neue Dinge ermöglichen die die bisherigen vererben können, "Parent/Child" System aber eben erweitert. Natürlich innerhalb ihrer Zugehörigkeit (bezüglich der Inventarorientierung).


    Dabei habe ich das Inventarsystem und allgemein so gemacht das 6 Inventar-Systeme vorhanden sind; Waffen, Nahrung, Fahrzeuge usw.

    Dadurch kann ich die allgemeine Last verschieben (im späteren Verlauf kommen erst die großen Probleme), in anderen Spielen habe ich gemerkt das wenn man alles über ein System laufen lässt das die Performance darunter enorm leidet (weil ja immer alle Informationen ((auch wenn leer)) mitgeliefert werden).


    Natürlich hoffe ich das es so funktioniert wie gedacht. Muss nur noch gucken wie ich die ganzen Sachen in der Welt speichern kann (Persistenz). So kann ich z.B. gewisse Dinge deaktivieren ohne das davon alle betroffen sind. Als Beispiel wäre da die Gebäude im Spiel, dort könnte man die Informationen deaktivieren (Sleep) bis diese gebraucht werden (Awake). Es macht einen Unterschied ob ich jetzt 1000 Häuser habe die voll mit Informationen sind (weil das im Laufe der Zeit ja mehr an Informationen wird) oder 1000 Häuser bei der ich die Informationsdichte selbst regulieren kann, ohne das darin Informationen sind die nicht dazugehören (als Beispiel Fahrzeugeigenschaften usw.).


    Ich möchte das die Spieler selber Entscheidungen treffen können und dürfen legendäre Gegenstände zu erzeugen, ganz nach ihren Wünschen. Das wird genau den Nerf der Zeit treffen wenn Kreativität der Spieler gefördert wird, natürlich wird das Balancing berücksichtigt. Alles im Spiel ist endlich. Sollte eine Waffe zu übermächtig sein, kann diese wieder zerstört werden. Darum die Aufteilung weil ich so mehr Spielraum innerhalb der Bereiche habe. Falls mal was kaputt gehen sollte (was ja immer mal passieren kann) ist nur der Bereich davon betroffen und nicht alles andere. Ausgenommen das was damit zusammenhängt könnte auch etwas fehlerhaft sein.


    ---

    Zu meinem Fehlerproblem:


    Derzeit habe ich diese Fehlermeldungen (gelbe Schrift) wie kann ich das beheben? Es scheint so als ob ein Array leer ist und dann doch nicht (habe es gegengeprüft). Muss ich da einfach nur überall ein "IsValidIndex" machen oder so um das zu beheben, oder ist das harmlos?

    Es funktioniert ja alles wunderbar. Im Internet schreiben einige das es harmlose Fehler sind, trotzdem würde ich verhindern wollen das diese Fehlermeldung erscheint (um zukünftig andere Fehlermeldungen besser analysieren zu können).