Beiträge von Annubis

    Mal davon ab, dass ich das nicht mit einem Licht machen würde. Der einfachste Weg ist ne Timeline. Die Intensität lässt du dir dann zurückgeben. Vorteil: Du hast vollen Einfluss darauf, wie schnell und starkt dein Licht blinken soll.


    Tip: Mach nen Macro draus. Wirst du wohl oft benötigen, denn diese Interaktionsanzeige benötigt dann jedes Objekt, alternativ bau es gleich in den MasterActor ein ;)


    PointLight halte ich deswegen für nicht gut, da dir immer eine berechnete Lichtquelle flöten geht nur um so eine Anzeige zu erreichen. Letztlich isses ja ein MoveAbleLight.


    Die Timeline würd ich über einen Trigger auslösen. Scheint mir die einfachste Variante ohne Rechenleistung wegzufressen.

    Die Landscape ist grenzenlos, vollkommen egal ob skaliert oder nicht. Der Aufwand hinter der Landscape ist jedoch riesig. Der einfachste Weg eine unendliche Landscape zu erstellen ist WorldComposition.


    Es wird ein Unterordner erstellt indem die Hauptkarte (Persistent Level) erstellt wird. Hier kommt keine Landscape rein. Dann schaltet ihr WorldComposition ein. Unter dem Menüpunkt "Levels" kann dann eingestellt werden, wie wann und wo die einzelnen Landscape und die sonstigen Levels mit Folliage und StaticMeshes erscheinen sollen (streaming).


    Der einfachste Aufbau ist eine Rasterkarte auf einem Papier anzulegen und dann die Quadranten logisch zu nummerieren.


    Beispiel:


    Map_0_0_0 - Landscape
    Map_0_0_0_F - Folliage auf der Karte Map_0_0_0
    Map_0_0_0_SM - StaticMeshes auf der Karte Map_0_0_0


    Map_0_0_1 - Landscape +1 über der Ausgangskarte
    Map_0_0_1_F - Folliage auf der Karte Map_0_0_1


    Das Prinzip ist denke ich klar soweit.
    Im Menüpunkt "Levels" kann man bei eingeschalteter WorldComposition den jeweiligen Levels eine Kategorie zuweisen und je nach Kategorie angeben, auf welcher Entfernung sie ins Spiel gestreamt werden oder gelöscht werden sollen.


    Bei der Benennung mit Map_0_0_0 kann man die erste 0 dafür verwenden mehrere Levels übereinander zu legen.
    Beispiel:


    Map_0_0_0 - Landscape (low)
    Map_1_0_0 - Landscape (high)


    Die beiden Level haben ein niedrig und ein Hoch aufgelöstes Landscape, wobei das natürlich das hochaufgelöste Landscape über den Low liegt. Man stopft jetzt im Compositionfenster die Low-Maps in eine Kategorie mit beispielsweise 1000m und die High in eine Kategorie mit 500m. Das rein und rausstreamen erledigt die Engine.


    In zwei weitere Kategorien kommen die Folliage und die Static Meshes. Für große und sehr Dichte Wälder kann man so extrem viele Bäume erstellen sodass es so schein als würde man kilomenterweit durch einen dichten Wald mit tausenden von Bäumen laufen. Tatsächlich werden aber immer nur ein paar 100 Bäume rein und raus gestreamt.


    Der zweite vorteil des Systems liegt im Editor selber. Alle Levels auf denen man gerade in einer Open World nicht arbeitet können so super einfach ausgeblendet werden.


    Dritter Vorteil ist, dass jede Landscape mit einer eigenen Materialinstanz belegt werden kann. Also steht einer Graslandschaft und einer Wüstenlandschaft oder einer Steppe nichts im Wege, da eine Limitierung der 16 Texturen so umgangen werden kann.


    Soweit ich das bis jetzt testen konnte, funktioniert es sogar, zwei Levels zur selben Zeit anzuzeigen und die getrennten Landscapes verschmelzen zu lassen. Ob das allerdings Sinn hinter der Angelegenheit ist, mag ich bezweifeln, jedenfalls konnte ich noch keine Problem damit feststellen.

    Die Foundations in Ark machen beim Anbau eine Kreuzprüfung und beim ersten setzen nicht. Dein Problem liegt mit großer Sicherheit bei der Fläche, auf die du baust, welche eben auch in der Luft hängt. Soweit ich mich erinnere, snappt eine Foundationan eine andere an, bleibt aber dennoch rot, wenn du versuchst über einen Abgrund zu bauen.


    Die Lösung liegt also darin zu überprüfen, ob deine bebaubare Fläche das erforderliche Attribut hat. Hierzu solltest du mal die Modelle für Felsen oder ähnliche Meshes rausfiltern die nicht Landscape sind aber auf denen gebaut werden kann.


    Zweite Lösung ist, dass du bei den Foundations die Abfrage nach vorhandenem Boden löschst, dass bedingt natürlich, dass du alles in den Modordner kopieren und editieren musst, was du nicht willst, also wird wohl nur Variante 1 dir weiter helfen.


    Lösung: Gaukel dem der Foundation vor, du hättest einen bebaubaren Mesh. Finde das zu setzende Attribut.


    LG


    Edit meint nach nochmaligem überlegen: Es könnte wohl statt einem Attribut auch einfach nur eine Kollisionsabfrage sein. Schau mal, ob es spezielle Kanäle in den Kollisionen der Meshes gibt auf denen gebaut werden kann, dann musst du nur die Kollision festlegen.

    Du machst einen ActorBP und gibst ihm einen StaticMesh. Dann gibst du ihm die Animation (Endrücken). Dann bekommt dein BP eine Variable mit Counter (int) als Default 1 und mach ihn editierbar. Dann ein GetAllActorOfClass und in dem Array was du erhälst suchst du nach dem TAG.


    Mach einen zweiten ActorBP mit einem Zahlenfeld. Dort ebenfalls eine Variable CounterB mit Default 0. Dann vergibst du ein TAG mit Nummer1.


    Wenn du beides hast, dann kannst du bei deinem Butten den Zählwert auf -1 setzen. Wenn du jetzt den Button drückst, dann bekommt er alle Zahlenfelder und du filterst das Zahlenfeld mit dem TAG raus, was du willst, und castest dann auf das Zahlenfeld und übergibst den Counter als 1 (oberer Button) oder -1 (unterer Button) und lässt ne simple Rechenoperation das Ergebnis im Zahlenfeld anzeigen.


    Als TAG gibst zu dem Zahlenfeld ne fortlaufende ID und dann musst du nur noch alles ordentlich platzieren. Die Menge spielt dann quasi keine Rolle mehr.

    Ich komme mit deiner Erklärung nicht ganz zurecht. Zunächst findet eine Rücksetzung einer Variablen dann statt, wenn du den zugrundeliegenden Wert (int,float, etc.) änderst, das ist denke ich verständlich.


    Wenn du dann allerdings von Savegame redest, kommt mir grad der Zusammenhang nicht in den Sinn. Nimm doch für dein Savegame eine Variable mit dem Typ Actor und mach ein Array draus, dann speicherst du alles in dieses Array. Die Daten werden erhalten. Dafür brauchst du kein Struct.


    Wenn ich das richtig sehe, dann gibt es außer Actor nichts, was sich in deinem Level ändern sollte. Denn nur den Typ Actor als oberste Variable kannst du im Spiel verwenden, um zu Interagieren. Ansonsten musst du nur noch deinen Charakter abspeichern.


    Beispiel: Hast du eine Kiste mit Gegenstände, dann besteht das Inventar der Kiste aus einem Struct, aber die Kiste selbst ist ein Actor, ergo, alles was darin an Variablen enthalten ist, also auch das Struct des Inhalts, wird abgespeichert.


    Ich hab das halt so gelöst, und bis dato funktioniert das auch. Die einzige Überlegung ist halt, ob du alle Actors eines Level zu einem bestimmten Zeitpunkt speichern möchtest oder ob du jede Änderung sofort abspeicherst. Beides hat seine Vor und Nachteile.

    Wenn du eine gute UVMap hast, dann kannst du die Textur extern einfach runterskalieren. Texcoords hilft dir dann, die Textur ordentlich auf den Mesh zu bekommen.


    Über ein DistanceBlend beispielsweise kannst du auch zwischen mehreren Texturen interpolieren lassen.


    Viel wichtiger bei den Materialien ist allerdings, dass du ab einer gewissen Entfernung zur Kamera nur noch Diffuse benutzt und alles andere abschaltest. Denn wirklich genial muss ja nur das aussehen, was direkt vor der Nase des Spielers ist.


    Allein das reduzieren der Textur von 4k auf 512 macht in der Performance keinen signifikanten Unterschied. Performanter wird es eben auch dadurch, dass du auf entfernten Objekten quasi Tesselation, Displacement und Normalmaps und was sonst noch alles dazugehört abschaltest. Hierfür kannst du je nach gewünschter Performance die Entfernung regulieren, bei der die Abschaltung von statten gehen soll.


    Beispielsweise benutzt du den DistanceBlend um zunächst zwischen einer 2k und einer 512er Texture zu interpolieren und den selben Wert kannst du nutzen um sämtliche anderen PBR-Werte abzuschalten. Nutzt du das in Kombination und dann noch mit LOD-Meshes, dann kannst du je nach eingestellter Sichtweite weit über 400 Charaktere darstellen.


    Ich habe sogar schon gesehen, dass Charaktermodelle als Bild mit einem Alpha als letzte LOD-Stufe eingefügt werden, dann kannst du quasi am Horizont deines Sichtfeldes eine nahezu unendliche Anzahl an sich bewegenden Charakteren anzeigen lassen, Beispielsweise ein Kriegsheer.


    Bis vor Kurzem kannte ich nur die Blendmethoden übers Interpolieren, aber wenn man einmal das IF-Statement lieben lernt, dann lassen sich viele Dinge auch darüber lösen ohne umständliche Mathematik in Anspruch nehmen zu müssen.

    Viel zu umständlich. Es gibt Triggerboxen die brauchen gar keine Performance. Die zugehörigen BP-Befehle sind BeginOverlap und EndOverlap.


    Da wird auch nichts ein oder Ausgeschaltet. Läufst du in die Box rein, dann löst das automatisch aus. Kannst halt an ne Tür rantreten und dann alle möglichen Sachen über die Triggerbox auslösen.


    Wenn du etwas entferntes oder andere Blueprints auslösen möchtest, die nicht über eine Triggerbox laufen, dann geht noch der Eventdispatcher. Da empfehle ich dir mal 2-3 Videos anzuschauen. Die sind sehr ressourcenschondend und lösen nur aus, wenn sie aufgerufen werden.


    Mit EventTicks würde ich grundsätzlich nur arbeiten, wenn es garnicht anders geht, aber für Ereignisse brauchst du die garnicht oder sehr sehr sehr selten.

    PixelNormalWS auslesen und Maskieren. So erhälst du einen Wert zwischen 0 und 1. Dieser Wert benennt den Slope. Wenn ich mich grad nicht irre, dann ist der Senkrecht 0 und Waagerecht 1. Maskieren kann ich dir grad nicht genau sagen, müsste aber B sein. Naja, gibt ja nur drei Möglichkeiten ;). ich kanns ja mal testen, wenn ich wieder daheim bin.


    Das IF-Statement ist ja nix besonderes... Denke ich jetzt mal frech ;)


    Die Höhe kannst du genauso blenden lassen, ohne dass gemalt werden muss. Dafür nimmst du AbsolutWorldPosition. Da ist die Maske dann natürlich B. Jetzt kannst du hier je nach Wert eine Interpolation durchführen , die dir dann für die Höhe eine andere Textur ausgibt. Beides lässt sich natürlich kombinieren. Also erhälst du ab einer Höhe beispielsweise dann statt Gras Felsen oder Schnee.

    Du willst abhängig von der Steigung automatisch Materialien übergehen lassen. Also quasi vom Gras zu Dreck zu Stein zu Sand zu Gras und das halt in Abhängigkeit von der jeweiligen Neigung des Landscapes?


    Falls dass dein Problem ist, solltest du über die Landscapenormal gehen und ein "IF"-Statement einbauen. Faktisch gibt es keine Begrenzung außer die Texturanzahl. Einzig aufpassen musst du nur, dass du die Negativwerte umwandelst also quasi über ein oneminus und dann dividierst.


    Im Übrigen kannst du auch mehr als 16 Texturen einbauen und über den gleichen Weg auch die Höhenabhängigkeit vom Gelände einbauen.


    Falls das dein Problem ist, dann sag bescheid.

    Warum interpolierst du die Textur nicht? Scheint mir der einfachste Weg zu sein und du brauchst nur S/W Bilder/Texturen. Da ist dann auch die Quali wesentlich besser, als von so einem WischWaschBild.

    Du verschickst Informationen nicht, sondern du forderst sie ab.


    Der Denkfehler ist wohl der, dass du Informationen aus einem Blueprint an einen anderen schicken willst, so rum funktioniert aber die Denke der Blueprints nicht.


    Beispielsweise willst du wert aus BP A im BP B verwenden, also öffnest du BP B und machst dort ein Cast-to-BP-A und dann erhälst du den BP-A als Ergebnis. Jetzt kannst du von dem Ergebnis mit Get Abfragen der einzelnen Variablen diese im BP-B verwenden und auch ändern.


    Diese Methode ist wohl die einfachste, um Werte auszutauschen bzw. abzufordern.


    Die zweite variante wäre dann über ein Interface zu gehen, dafür musst du einen speziellen InterfaceBP erstellen. Mit dieser Variante lässt sich hervorragend Interaktion umsetzen. Bei dieser Möglichkeit werden auch Werte "verschickt". Das Interface muss aber im jeweiligen BP eingebunden werden, damit es auch funktioniert. Dafür solltest du allerdings ein Video schauen, da sich das in Textform nur sehr schwer erklären lässt.


    LG Annubis