Beiträge von Annubis

    Zum Thema: Landschaft.


    Ich habe selbst viel damit probiert, wie groß Landschaften sein können. Ergebnis: grenzenlos.


    Die Erkenntnis ist allerdings, dass man klein anfängt. Der eigentlich Punkt ist, das man begreift, wie Streaming in der UE4 funktioniert. Schau die viele Videos von LevelStreaming und WoldComposition an.


    Man kann quasi mit einer 100x100m Map anfangen und die später erweitern. Dieses Herangehen hat mehere Vorteile: du siehst schnell Fortschritt. Du kannst Performanceprobleme rechtzeitig erkennen. Du kannst die Landschaft beliebig erweitern.


    Gerade das WorldCompositionTool in der UE4 ist extrem genial. Versuch dich als erstes da drinn und erstell dir eine Map und erweitere sie dann. Am Anfang ganz ohne Material, einfach nur grau. Sculpte und erweitere die Map und du wirst schnell sehen, wie die Funktion ist.


    Dann beschäftigst du dich mit den LandscapeMaterial. Als Tip: Füge am anfang keine Texturen ein, sondern verwende Platzhalter. Nutze erstmal Farben (rot, grün, blau, gelb). Damit verstehst du viel besser, wie das Material funktioniert.


    Als nächstes erstellst du einen Baum und einen Stein. Nicht mehr. Dann lernst du, wie du Bäume und Steine in Abhängigkeit des Bodens spawnen lässt.


    Spätestens an dieser Stelle wirst du die ersten Performanceprobleme haben und anfangen, dich in die Problematik Landscape noch mehr einzulesen.


    Wenn das alles steht, dann kannst du Anfangen dein eigentlich Spiel auf diese Karte zu bekommen.

    Erstmal vergibt die Engine garnichts. Deine Überlegung folgt keiner Logik.


    Dein Inventar ist typischerweise ein Array. Jedes Array hat einen Index, der automatisch erzeugt wird. Dieser Indes KANN als ID verwendet werden. Legst du aus deinen drei Datenbanken jeweils ein Objekt in deinem Inventar ab, dann wird ein Array mit drei Gegenständen angelegt.


    Jeder Gegenstand hat einen eigenen Index im InventarArray. Die Eigenschaftten, die du jetzt abfragst (essbar, löschbar, ausrüstbar) stehen in keiner Logik zum Index. Das InventarArray benötigt eine Referenz zur Datenbank.


    In deinem InventarStruct muss also irgendwo vermerkt werden, aus welcher Datenbank der Gegenstand abgeleietet wird. Über diese Eigenschaft, kannst du dann die Verwendung ableiten.


    Es ist also mit anderen Worten ein Fehler, wenn "dreimal 0" in deinem Inventar vorhanden ist. Diese "0" müsstest du selbst referenziert haben, was keiner eindeutigen Logik und damit keiner eindeutigen Identifizierbarkeit folgt.


    Ein Gegenstand der einzigartig ist, benötigt eine eindeutige Identifizierung (ID). Die Grundkategorie "Waffe" ist nicht eindeutig, wenn es mehrere Waffen gibt. Hat deine Datenbank mehere Waffen, die später in ihren Eigenschaften geändert werden könne, dann benötigt das Ergebnis eine eigene eindeutige Identifizierung.


    Dein Hauptproblem bei getrennten Datenbanken ist die fehlende Referenz zwischen Inventar und Datenbank.

    Ich habe mir das jetzt mal grob alles durchgelesen. Wenn ich das richtig verstehe, unterliegt dein System keinem wesentlichen Fehler.


    Datenbank=DataTable:


    hier legst du soviele an, wie du gern hättest. So wie du das gemacht hast, sollten des drei Datenbanken sein. In einer Datenbank gibt es jedes Objekt mit seinen Grundwerten. Je nachdem wie begabt dein Char ist, sollen sich diese Werte später durch Handwerk o.ä. ändern.


    Inventar=Array:


    Es gibt nur ein einziges Array, wenn es um das Inventar deines Charakters oder jeden anderen Objektes in der Spielwelt geht. Bsp Kisten, Schränke, Truhen, etc.


    Die Übertragung der Daten aus den einzelnen Datenbanken erfolgt über eine Logik, welche die Gegenstände in dein Inventar überträgt.


    Jeder Gegenstand muss identifizierbar sein, was man entweder über die Vergabe einer eigenen ID ermöglicht oder den bestehenden Index des Arrays benutzt, der automatisch erzeugt wird.


    Gegenstände die absolut gleich in ihren Eigenschaften sind (Aussehen und Werte), können gestapelt werden, sofern du das möchtest. Hierbei musst du nur im Struct innerhalb deines Arrays eine Variable haben, die angibt, ob und wieviel gestapelt werden kann.


    Erstellst du im Verlauf des Spieles einen Gegenstand aus deiner Datenbank, welcher jedoch dann auf Grund der Begabung deines Chars bessere oder schlechtere Werte als der Standardgegenstand aus der Datenbank hat, so muss dieser Gegenstand eine neue ID innerhalb deines Inventars bekommen.


    Das Sortieren erfolgt dann über gesonderten Logiken (Name, Anzahl, etc.). Hierfür gibt es aber genug Tutorials.

    Interessante Ausführungen, man lernt doch immer wieder dazu. Unterscheiden würd ich ja erstmal, was Grafikperformance ist und was Berechnungsperformance ist.


    Dein Problem ist doch eigentlich Streaming. Wenn dein LOD so gering ist, wirds doch eh nicht gestreamt. Es gibt wirklich viele gute Videos zum Streaming, da solltest eine passende Lösung finden.

    Ja, du kannst ja auch ne Minute ins Delay eintragen. Das Spiel läuft einfach weiter. Wäre es nicht parallel würde das Spiel einfach stehen bleiben. Das wurde hier aber glaub ich bereits erwähnt.

    Ein Delay ist ein Platzhalter. Es läuft immer nacheinander, anderfalls benötigst du C++ Code um etwas Multicore zu machen. Sollte das mittlerweile über BP gehen, dann wäre ein Link nett. Mit anderen Worten läuft da garnichts parallel wenn es um Berechnungen und Events geht.

    Hab ich jetzt leider nicht verstanden. Wir haben doch jetzt alle bestätigt, sogar ich mit meinen Tests, dass Events bis zum Ende abgespielt werden und die nachfolgenden Events erst dann abgespielt werden, wenn die vorher anschließende Event fertig ist. Ein Delay hebt es auf. Es sagt dem Event Strang hier ist schluss, hier übernehme ich, somit wird das nächste Event abgespielt, falls eins drann ist.

    so wie du das formulierst, ist es nicht richtig. Ein Delay ist nur eine Verzögerung. Bei jedem Tick wird das Delay berücksichtigt ("berechnet") und zwar solange, bis das Delay abgelaufen ist und dann kommt alles nach dem Delay. Er behält sich die dem Delay nachfolgenden Schritte quasi für die Ticks nach dem Delay vor.


    Events=Ereignis. Tritt das Ereignis/Bedingung in einem Tick nicht ein (Mausklick), dann wird in dem Tick nicht berechnet, was am EventMausklick dranhängt.


    So solltest du auch deine Beispiele sehen. Deine Bedingung/Event tritt ein und er zündet zwei weitere Events. Das erste Event sagt im ersten Tick: warte. Das zweite Event führt einen Befehl aus: zeige Text an. Kommt jetzt der nächste Tick, dann wird nur noch das erste Event ausgeführt, da sich das Delay vormerkt, dass nach ablauf des Delays etwas ausgeführt werden soll.


    Du kannst dir das wie in der Elektrotechnik vorstellen. Erst wenn der Kondensator aufgeladen ist, wird weitergemacht.

    Die Verarbeitungszeit der Textanzeige ist bei dem ersten Beispiel schneller als der Aufruf des zweiten Events.
    Wenn du tausend mal Nix ausgeben lässt dann wird irgendwann zwischen den nixen eine zwei stehen

    Nein wird es nicht. Er kann des auch 1mio mal machen und das Nix wird erst am Ende kommen. Erst wenn er Multiprozessorsupport einbaut, dann wird die Aussage zutreffen.


    In einem Tick wird alles "nacheinander" abgearbeit. Also für uns in einer Zehntausendstel Sekunde. Praktisch also nacheinander. Erst wenn der Tick durch mehrere Pipelines des Prozessors berechnet wird, kann es passieren, dass das "nix" mittendrinn ausgegeben wird. Läuft es über einen Prozessor, wird auch der alles nacheinander berechnen. Etwas anderes ist allerdings sein Delay, denn der überspringt ja gerade die nächsten Ticks bis das Delay abgearbeitet ist. Das Sequence macht also nix anderes und arbeitet alles was drann hängt in einem Tick ab. Wenn es zuviel ist, dann laggt das Spiel, weil er nicht mehr nach kommt und ein Tick wahrnehmbar wird.


    Aber ansonsten liege ich doch richtig, dass das Event 1 abgespielt wird, bis es sein Ende erreicht hat und dann erst Event 2 abgespielt wird?

    Dazu ein klares nein. Wie du selbst schreibst, hat dein Satz eine Bedingung. Wenn/Dann. Diese Bedinung muss programmiert werden, was nicht der Fall ist, dein Ergebnis tritt nur durch das Delay ein. Also immernoch "Nein" zu diese Aussage. Es wird immer alles abgefeuert. Da wird auf nichts gewartet, wenn du das willst, dann musst du es programmieren. Kannst du an einer Sequence alles mögliche testen.


    Spiel einfach zwei Sounds ab. Da wird nur für einen theoretischen Tick "gewartet" aber tatsächlich wird alles abgefeuert. Der wartet nicht erst bis Sound 1 fertig ist mit abspielen und spielt dann Sound 2. Dann musst du die auch hintereinader hängen und nicht mit Events erstellen. Das Beispiel is eh "verkehrt" dafür gibts die SequenceNote.

    Event=Ereignis und Interface=Schnittstelle. Bisweilen haben die für micht garnichts miteinander zu tun als das sie nacheinander behandelt werden aber nicht zu vergleichen sind.


    Das Vorgehen aus dem UnrealForum ist hinsichtlich des Interfaces richtig. Dahinter steckt eine Programmierlogik. Events werden da abgehandelt, wo sie auftreten. Die Schadensberechnung wird beim Gegner durchgeführt. Die Schadensursache wird übermittelt. Die "Munition" ist letztlich nur Grafik.


    CustomEvents dienen in erster Linie dazu, verschiedene Situationen zu differenzieren (verschiedene Events). Jedes differenzierbare Ereignis kann mit einem Event verbunden werden, sodass man am Ende der Übersichtlichkeit Rechnung trägt.


    Einfachstes Event ist "Benutzen/Use". Man implementiert dieses Event in jeden Actor, der eine Benutzung zulässt. Die Benutzung kann dann im jeweiligen Actor angepasst werden. Bsp: öffne Tür, öffne Kiste, trinke Wasser, ziehe am Hebel. Das Interface vermeldet aber immer nur im anvisierten Objekt die as UseEvent. Gibt es ein solches Event im anvisierten Actor nicht, passiert nichts.


    Da man das Event vorprüfen kann, funktionieren so auch Tastenbelegungen unter verschiedenen Bedingungen. Befinde ich mich also beispielsweise in einem Baumenü oder in der Übersichtskarte, so kann bspw "E-Key" eine andere Funktion (Event) auslösen als das typische UseEvent. Genauso kann ich Prüfungen vorschalten, wenn die Maus über bestimmten Objekten liegt, also das Trace einen spezifizierten Actor ausgibt (IF-Abfrage/Select).

    bei den Münzen kommt man schnell drauf, weil sehr schnell auffällt, dass keine einzige die Position wirklich ändert oder Münzen sich gar berühren oder übereinander liegen. Sleepy hat schon recht, der schwarze Untergrund schluckt das ganze WischiWaschi.

    du nimmst die Sphere vom Character und verschiebst sie zu einem beliebigen punkt. Dann prüfst du, ob eine Collision vorliegt. Wenn nix kollidiert, dann erst verschiebst du den Character selbst. Ist auch über eine ganz normale SpereCollisionPrüfung möglich. Du musst nur den Punkt angeben, an welchem geprüft werden soll.


    Als nächstes kannst du dann bei einer Collision prüfen lassen, wo die Collision stattfindet, dann verschiebst du um 5 units bis keine Collision mehr stattfindent. Wenn an mindestens 4 Punkten eine Collision stattfinden, dann passt dein Character nicht an den angegebenen Ort und teleportiert sich dort nicht hin.


    Die SphereCollision gibt den CollisionPoint aus. Bei 100Iterationen bei der Prüfung würde ich am Anfang abbrechen, da dies dann 5m Prüfung entspricht.

    Ändern sich deine Assets @Runtime nicht, dann nimm Sleepys variante. Andernfalls solltest du WorldAlignedTextures benutzen. Bei einer Ingameskalierung verzieht es dir sonst die Texturen, wenn du das über standartisierte UVs machst.

    Hey, hab mir gerade die 64bit Beta von Blender 2.8 runtergeladen. Läuft soweit auch gut. Sobald ich allerdings auf die Preferences klicke, schmiert Blender komplett ab. Wenn ich den Shortcut Strg+Alt+U benutze, passiert das selbe.


    Ältere Googleeinträge meinen, das es Treiber sind. Also hab ich die mal auf den aktuellen Stand gebracht. Ohne Erfolg.


    Administratorrechte und Schreibschutz bringt auch nix. Vielleicht weis ja einer von euch, was zu tun ist, da leider auch keine Fehlermeldung kommt, aus der man vielleicht schlau werden könnte. Deshalb auch kein Screenshot ;)


    LG Annubis