Beiträge von Tomura

    Habs mir mal angeschaut - mit einem lachenden und einem weinenden Auge. Lachend weil Performance wirklich gut ist - um Schummeleien auszuschliessen habe ich mal die Kameraanimation weggemacht und die über die Maus gesteuert - wirklich gut. Die Characters haben viele LOD und sehen von nahem und weit weg wirklich gut aus. Auch Klamotten sind wie die Haare mit Physics - so hüpfen die Bändel vom Hoodie beim bewegen munter umher. WIrklich nett.


    Weinendes Auge: Das Konzept ist - es gibt zumindest bei den beiden Demo Characters keinen Körper. Sprich Kopf und Hände und die Klamotten. Unter den Klamotten ist erst mal nichts. Nein nicht weinend weil ich die ausziehen wollte - aber weil das so ein retarget von vorhadenen Animationen schwieriger macht. Insgesamt wirkt das Konzept so wie eine Kopie von Mixamo nur mit richtig guten Models. Schätze sowas wird dabei rauskommen. Wie man die models in UE4 animiert hab ich noch nicht raus - soll aber wohl möglich sein.

    So rein von der Optimierung her ergibt es Sinn den Körper unter der Kleidung weg zu lassen (sind ja unnötig Polygone für die du mindestens das Culling prüfen musst und es gibt weniger Gefahr für Z-Fighting).

    Die Frage wird wohl sein, wie viel die Character Creation Software hergibt und ob es solche Optionen gibt falls man sie braucht. Du kannst es ja mal bei Epic als Feedback einkippen.


    Animation ist scheinbar angedacht über Control Rig. Hab mich damit nicht viel beschäftigt (muss ich aber mal, weil ich damit mal ein gutes Full Body VR Rig machen will). Ansonsten haben die Firmen die Epic dazu aufgekauft hat auch was mit Motion Capture und Animation am Hut. Das Sample soll ja nur die Qualität der Modelle und Shader zeigen, soweit ich verstanden habe.

    Geht nicht wirklich. Wie willst du das machen? Die Gegner für die Leute aus der Abschlussklasse unsichtbar machen? Und die schauen sich dann an wie die aus der Unterstufe gegen Luft kämpfen? Entweder Multiplayer oder nicht. Beste Lösung wäre daß die Gegner nach Abschliessen der Quest "nicht mehr attraktiv" sind, also kaum oder gar keine Erfahrung und loot mehr bringen. Bei unbelehrbaren Trollen noch nen "Fluch" drauf der stats kostet oder so. "Das Essen nicht mehr schmackhaft machen".

    Also phasing in MMOs meint eher dass man Spieler auf Instanzen verteilt, je nach dem wie weit sie sind.

    Mal als Beispiel:

    Es gibt eine Quest bei der am Ende der Quest Story Line eine Stadt zerstört wird, so sollten ja Spieler die den Quest gespielt haben nur noch auf eine Instanz kommen wo sich auf der Map die Zerstörte Stadt befindet, während Spieler, die noch nicht an dem Punkt der Story gekommen sind auf eine Version kommen, bei der die Stadt noch existiert. Ziel davon ist es dass Spieler sich mehr so fühlen als ob sie etwas in der Welt bewirken im Kontrast zu klassischen MMOs wo man als Spieler keinen Einfluss auf die Welt hat, da sowohl Anfänger als auch Veteranen auf der gleichen Karte spielen.


    Das ganze hat natürlich ein paar Design Probleme. Man kann damit durchaus die Community Fragmentieren. Von daher sollte es gut überlegt sein und man sollte sich sicher sein, dass man eine Community bekommt die groß genug ist.


    An sich würdest du so ein System wahrscheinlich nicht einmal in der UE4 implementieren, sondern eher als server-seitigen Service versucht einen Spieler beim Wechsel der Map/Instanz auf eine entsprechende Instanz schickt, die die richtigen Bedingungen erfüllt. Im Grunde ähnlich wie ein Matchmaking System, das versucht Spieler mit gleichem Skill auf einen Server zu verteilen (nur dass nach Quest Progress verteilt wird.)

    Also ich glaube die Hälfte des threads kann man löschen/verschieben.


    Zu dem typischen Tipp mit "Fang was kleines an, dann wirst du auch fertig". Das ist durchaus richtig, aber am Ende ist es egal ob man was kleines macht, fertig wird, aber das ganze ein Minigame ist, was keine Sau interessiert inklusive sich selbst, oder ob man was großes macht und nicht fertig ist. Ich finde sogar, dass - je nach Persönlichkeit - ein größeres Projekt den Lerneffekt steigert, da die Motivation höher sein kann.


    Also mein Tipp. Einfach Anfangen!

    (Solange du nicht deine Existenz damit ruinierst.)


    Was die Suche nach Teammitgliedern angeht: Ich glaube das ist hier generell echt schwer. Im Modding bereich war es einfach, da alle Amateure waren, die größtenteils Schüler oder Studenten waren und das ganze zum Spaß gemacht haben.

    Der Indie Dev Bereich ist da etwas durchmischter mit Profis, Amateuren und Träumern in verschiedenen Alterslassen und Lebenssituationen und somit sehr verschiedenen Ansprüchen.

    Das klingt jetzt vielleicht ein bisschen gemein, aber man könnte sich solche Fragen sparen, wenn man sich die Verträge, denen man zustimmt, durchliest.


    Die Unreal Engine Eula spricht von Abgaben pro Produkt - also z.B. pro Spiel. Dabei zählen nicht nur der Umsatz aus dem direkten Verkauf, sondern eben auch Echtgeldshops, DLCs, Abonnements, Crowdfunding-Einnahmen, Werbung, Zahlungen von Publishern / Investitionen in das Produkt, (Exklusiv-)Verträge und alle weiteren Umsätze die durch das Produkt generiert werden (pay-to-play mods z.B.)

    Das ist nicht 100% richtig. Es geht im den Umsatz durch den Verkauf des Produktes. Irgendwo gibt es z.B. eine klarstellung dazu. Z.B. mit dem Beispiel Crowd Funding:

    Bekommt die Person durch das bezahlen eines Crowdfunding Tiers das Produkt selbst, so zählt das in den Umsatz hinein. Bekommt der Kunde das Spiel nicht durch das einzahlen (sonder z.B. ein Poster) in das Crowdfunding so zählt das ganze nicht in den Umsatz rein.

    Das ganze wird komplexer wenn es einen gemischten Tier gibt.

    Sagen wir mal Tier 1 kostet 20€ und man bekommt ein Poster und Tier 2 kostet 50€ und man bekommt ein Poster und das Spiel. So ist der Umsatz den du durch das Spiel machst 30€. Von diesen 30€ musst du 5% an Epic zahlen.


    https://forums.unrealengine.co…unding-and-that-magical-5


    So verhält es sich z.B. auch mit Zahlungen an den Publisher oder von Investoren. In der Regel handelt es sich hier nicht um eine Zahlung die mit dem kauf eines Exemplars des Spieles verbunden ist. Sondern es wird in dein Unternehmen investiert, oder eine Dienstleistung eingekauft.

    Edit: Hier wird es aber etwas schwierig, da es z.T. in der EULA genannt wird. Am besten besorgst du dir einen Experten der dich berät. Soweit ich immer die Beispiele verstanden habe geht es beim Produkt um das Endprodukt, jedoch nicht um die Entwicklungsdienstleistung des Endproduktes.


    https://www.unrealengine.com/en-US/eula/publishing

    Zitat

    The royalty is based on gross revenue from end users, regardless of whether you sell your Product to end users directly, self-publish via the App Store or any similar store, or work with a publisher. The following simplified example illustrates the application of the royalty to gross sales: if your Product earns $10 on the App Store, Apple may pay you $7 (having deducted 30% as a distribution fee), but your royalty to Epic would still be 5% of $10 (or $0.50).


    Royalties that you pay on an advance payment of revenue for a Product that is recoupable by the payer, such as a publisher, may be credited against future royalty payments that you incur under this Agreement for that Product.



    DLC, Echtgeldshops, Pay2Play Mods, etc zählen natürlich mit rein, da du hier ja auch Produkte verkaufst die mit der UE4 erstellt wurden.

    Also du müsstest mal Teile deines Anim Blueprints zeigen.

    Das Problem wird sein, dass du den falschen Richtungsvector oder Winkel nutzt. Wahrscheinlich benutzt du eine Richtung die auf deinem Input basiert.


    Am Ende benötigst du aber in einem Top Down Fall den Winkel relativ zur Blickrichtung bzw. den Bewegungsrichtungsvektor innerhalb zum Koordinatensystem des Pawn Meshes. Du musst also wahrscheinlich etwas Koordinatentransformation betreiben.

    Was aber seltsam ist, das nur der Server die PlayerController für die Clients hat nicht die Clients selber.


    Ist das normal?

    Ja.

    Der PlayerController existiert nur auf der Maschine des Besitzers (der Player der vom PlayerController repräsentiert wird) und auf dem Server (da der ja alles Kontrolliert).

    Player spezifische Daten die auf allen Maschinen verfügbar sein sollen, sollte man in ein Kind der PlayerState Klasse packen.

    Moin,


    also das Problem steht schon im Titel. Wenn ich mir z.B. Tutorials zu Materials ansehe, so wird das bei so gut wie allen innerhalb von maximal 5 Sekunden angezeigt wie das Materials aussieht. Bei mir dauert das aber manchmal bis zu 2 Minuten. Und das compiling bzw. wenn ich auf Save oder Apply drücke, dauert dass auch ziemlich lange. Das ganze stört ziemlich den Workflow. Hat da wer ähnliche Erfahrungen oder Probleme?


    Danke schon mal im voraus :)

    Es kommt etwas darauf an was du machst, aber bei so typischen Dingen wie z.B. ein Material in dem nur Texturen in gewisse Outputs geroutet werden, würde ich empfehlen paar Typische Master-Materials mit Parametern zu erstellen, und dann nur über Material Instances zu Arbeiten:

    Das hat folgende Vorteile:

    • Du musst nicht Kompilieren, solange du das Master-Material nicht bearbeitest
    • Der Re-Use, des selben Materials sorgt dafür dass die Instances auf das selbe Shader Kompilat zugreifen, statt dass du viele Shader laden musst, die funktional eigentlich gleich sind.
    • Wenn du das Master Material verbesserst, wirkt sich die Verbesserung gleich auf alle instances aus.

    Falls das keine Möglichkeit ist hilft nur bessere Hardware.

    Eine schnelle SSD, ein schneller CPU (vorallem einer mit vielen cores/threads) machen das kompilieren schneller.


    Edit: Z.B. wäre hier mal ein Beispielhaftes Master-Material, was im Grunde für so gut wie jedes Material as Substance Painter Funktioniert. Als zusatz feature habe ich noch min/max Roughness Parameter eingefügt, um zur Not die Roughness in-engine anpassen zu können, anstatt noch mal in ein anderes Tool zu gehen, um es anzupassen.



    Hast du so etwas einmal kannst du einfach in Material instances ohne zu kompilieren Materials des selben Formats erstellen:

    Um das richtig zu verstehen.

    Pawn -> MyCharacter (Actor)?

    Ja. Ein Character ist eine Art Pawn, ein Pawn ist aber nicht unbedingt ein Character (z.B. könnte ein Pawn auch ein Spectator Pawn sein).


    Ich glaube das könnte das Problem dabei sein.

    Den PlayerController brauche ich vor dem laden der ganzen Widgets (Menüs), damit diese entsprechend zugeteilt werden können.

    An der Stelle wüsste ich auch nicht wie ich die ganzen Menüs auslagern sollte, denn die werden eben zum spielen gebraucht.

    Also du solltest unbedingt mal recherchieren wie das Gameplay Framework von UE4 abläuft:

    Ganz grob gesagt:

    Ganz oben ist die GameEngine diese existiert ab dem Start des Spiels, genauso die GameInstance, diese könnt nach der Engine. Beim Start wird eine Map/World geladen, die World lebt solange wie das Level existiert. Die Welt halt einen GameMode, welcher erzeugt wird nachdem die Settings der Welt verfügbar sind. Auch wird für jeden Spieler ein PlayerController erzeugt (+ das was noch so dazugehört), basierend darauf was im GameMode eingestellt ist. Der PlayerController spawnt dann einen Pawn und wenn der Pawn fertig gespawnt ist, dann wird dieser Possessed.


    Jetzt muss man sich das mal anschauen:

    1) Controller spawnt einen Pawn

    2) Pawn ist fertig gespawnt => Pawn->BeginPlay

    3) Controller übernimmt pawn d.h. der Controller des Pawns wird gesetzt => Pawn->Possessed


    D.h. wie ich gesagt habe, nimm das Possessed Event. Es gibt hier auch keine echte Verzögerung, das das ganze normalerweise im selben Frame stattfindet.


    Folgendes:

    Der Player Controller existiert vor dem Pawn. Der Pawn wird zuerst sauber gespawned inklusive BeginPlay Event. Erst danach wird der Pawn possessed, da erst hier alles was beim Spawn passieren soll passiert ist.

    Das heißt benutze nur Begin Play für Dinge die gemacht werden sollen nachdem der Pawn gespawnt ist und nur das innere des Pawns betrifft. An diesem Punkt hat der Pawn noch kaum Infos.

    Das mit den Breakpoints habe ich überall getestet.

    Wenn ich den Breakpoint auf CastToPlayerController setzte, wird dieser sofort ausgelöst.

    Setze ich den Breakpoint auf SetPlayerController dann lädt der bis zur unendlichkeit (das Problem was ich derzeit habe).

    Dann ist es doch klar. Der Cast schlägt fehl und du kommst nicht weiter. Also ist der Input des Casts Null oder ein PlayerController mit falscher Klasse. Da du in Begin Play bist, ist der Player Controller wahrscheinlich null, da dein Pawn noch nicht Possessed wurde. Also schieb die ganze Logik in das Possessed Event.

    Gibt es eine Möglichkeit eine Art "STOP" einzubauen bei der etwas ausgeführt und dann gestoppt wird, bis etwas anderes geladen ist, damit dann wenn geladen, nach dem Stop weiter geladen wird?

    Wenn du das machen musst machst du etwas falsch. Informiere dich über die Events die es gibt und den generellen Ablauf des Gameplay Frameworks. Was du vorschlägst ist eine riesige Verschwendung von Performance.

    PS: Könnt ihr mir eine grobe Auflistung schreiben, also von der Logik her, wie genau ein perfekter Start aussieht?

    Z.B.

    Wenn du den Perfekten Start eines Levels selbst programmieren musst, machst du etwas falsch. Wie gesagt die UE4 bietet schon ein Gameplay Framework, du musst nur wissen welche Events du Implementieren musst und welche Funktionen du überladen und erweitern musst.
    Von daher, wie ich schon öfter sage. Recherchier genau wie die Unreal Engine funktioniert, das kann auch paar Wochen/Monate dauern. Am einfachsten ist es natürlich einfach den C++ Code grob anzuschauen, aber es sollte auch z.T. erklärt ein. Wüsste aber nicht wie gut Epics Doku ist.


    BTW falls du Multiplayer machst:

    Das Possessed Event läuft nur auf dem Server. D.h. du musst für Client seitige Dinge auch Client Funktion aufrufen. In vielen Fällen geht auch das Restart Event, dort ist 100% klar dass alles abgehandelt wurde, aber wenn ich mich richtig erinnere feuert es nur beim Spawn des Pawns aber nicht, falls dieser mitten in seiner Lebenszeit possessed und unpossessed wird. Man könnte ja ein Spiel so programmieren, dass Spieler andere Pawns übernehmen oder die Kontrolle abgeben, etc. dann wird natürlich kein Restart Event gefeuert, weil der Pawn ja schon "gestartet" wurde.

    Grundsätzlich ist der Unterschied - wie Epic auch schreibt - daß der PlayerController immer erhalten bleibt - also auch wenn der pawn vernichtet wird. Ich würde so wenig wie möglich in den Player Controller packen - weil der eben wie gesagt auch erhalten bleibt wenn der Pawn zerstört ist - das kann das Spiel durchaus entlasten. Aber wenn es Sinn macht den PlayerController zu nehmen - eben weil man etwas durchgehend haben will - dann muss man das machen.

    Dem kann ich zustimmen. Mach dir einfach Gedanken, wo es hin passt. Bei Player Input wäre es z.B. schon gut dass es im Controller ist, da das Verhalten des Inputs sich ja verändern kann je nach Status des Players. Also z.B. wenn der Player im Options Menü ist, soll er ja nicht seinen Charakter steuern. So hast du eine recht guten architektorische Zwischenstufe um im Nachhinein zusätzliche Checks einzubauen die logisch eher dem Spieler gehören, als dem Charakter.

    Generell macht es mMn sinn das was den Spieler betrifft auch im Controller zu machen und das was den Pawn betrifft im Pawn und die Schnittstellen zwischen den beiden zu einfach wie möglich zu halten. So ist, wenn du nach dem Code einer bestimmten Funktionalität suchst sehr klar wo du schauen musst.


    BTW wenn du den Player Controller benötigst, solltest du auf der Pawn Seite nicht Begin Play nutzen. Das Funktioniert nur in Ausnahmefällen. Es sollte ein OnPossessed Event geben. Dies signalisiert, dass der Pawn von einem Controller übernommen wurde. Begin Play feuert aber gleich nachdem der Pawn gespawned wurde, aber noch nicht unbedingt Possessed.

    Dein Fehler kommt wahrscheinlich daher, dass der Pawn noch gar keinen Player Controller hat. Das kannst du recht einfach rausfinden indem du in deinen Blueprint reingebuggst über Breakpoints und Watchers.

    Oder einfach das Spiel packen und testen, da der Bug nur übern Play-Button in UE4 zu existieren scheint^^

    Was auch funktionieren könnte ist wie im Bug report den UE4Editor.exe mit dem argument "-game" zu starten (z.B. über ein .bat oder eine Verknüpfung.)


    Also wie folgt:

    <pfad zu UE4Editor.exe> <pfad zu deinem *.uproject file> -game


    statt der "<...>" entsprechenden Pfad angeben. Nicht vergessen dass "" nötig sein kann, falls der Pfad Leerzeichen oder sonstiges enthält.

    Damit startet die Engine wie ein normales Spiel, benötigt aber keine cooked Assets.

    Find ich jetzt aber nicht verwerflich. Sind ja die gleichen Rahmenbedingungen wie momentan bei Epic vs Google und Apple.

    Ist ähnlich. Hier ist es aber schwieriger in die Richtung zu argumentieren, da man ja trotzdem alternative Stores nutzen kann und darf, während das auf einem iPad/iPhone nicht möglich ist. Es kommt drauf an in welcher Macht-Position man im Markt steht, da die Gesetze das Ziel haben einen fairen Wettbewerb zu fördern und Monopole oder ähnliches (z.B. auch Preisabstimmungen zwischen Firmen, um sich gegenseitig einen Vorteil zu verschaffen) zu verhindern. Deswegen ist sowas oft eine schwere Sache, die oft mehrere längere Prozesse und Prüfungen benötigt.


    Mein Wissen dazu ist aber auch recht grob, aber ich muss hin und wieder Mal Schulungen zu solchen Themen anhören/durcharbeiten, weil solche Themen durchaus im Arbeitsalltag vorkommen können in einer größeren Firma. Sagen wir mal man zwingt als klarer Marktführer einen Händler, dass er Konkurrenzprodukte nicht anbieten und bewerben darf, wenn er das Produkt des Marktführers anbieten will, dann kann es durchaus ein solches Thema werden, wenn die restlichen Rahmenbedingungen stimmen.

    [...]

    Klar kann man jetzt über Apple, Google, Sony und Microsoft jammern - alles Ausbeuter und Monopolisten - aber die haben nunmal die Hardware, die Plattformen und ein Ökosystem mit vielen Kunden die auch wirklich Geld ausgeben geschaffen. Da kommt mir der Spruch "Die Hand beissen die einen füttert" in den Sinn. Klar findet die 30% kaum einer wirklich "fair" oder "gerecht", aber ganz ohne wir es nunmal nie gehen. Das ist wie wenn man auf der Strasse 100 leute fragt ob man morgen die Steuern abschaffen sollte, da sagen bestimmt die meisten sofort "ja" und würden sich morgen wundern warum es keine Polizei, Feuerwehr, Krankenhäuser und Strassen mehr gibt.

    [...]

    Das Problem bzw. die Argumentationsgrundlage ist die folgende:

    Das Problem was Epic hat ist, dass eine App auf dem App store auch für in-app-purchases 30% abgeben muss. Dies kommt daher, dass der einzige Zahlungsdienstleister der erlaubt ist, Apple ist. Technisch könnte man ja als Entwickler auch einen anderen Zahlungsdienstleister anbieten, was aber verboten ist. Genauso ist es auch verboten innerhalb der App darauf hinzuweisen. Ein ähnliches Verfahren läuft/lief zwischen Spotify und Apple, auch hier geht es darum dass Spotify gezwungen ist für ein Abo, was über die App abgeschlossen wurde 30% an Apple zu geben, nur weil Spotify gezwungen ist Apple als Zahlungsdienstleister zu nutzen. In falle von Spotify macht es dies noch schlimmer, da Apples eigenen Streamingdienste ihr Abo ohne die 30% anbieten können und somit einen unfairen Wettbewerbs und Preisvorteil haben können.

    https://ec.europa.eu/commissio…rner/detail/en/ip_20_1073


    Es geht also nicht einfach darum, dass Apple seinen Service billiger macht, sonder darum, dass Apple seinen Service aufzwingt und sich somit eine Monopolstellung verschafft. So die grobe Argumentation. Ob das nun rechtlich wirklich so ist wird sich zeigen. Ich fände es aber schon schön wenn das ganze Apple Ökosystem offener wird.

    Nochmal ein Nachtrag, da hier mMn etwas am Thema vorbei argumentiert wurde.


    Mit dem Kauf der Programme hast du nicht die Nutzungsrechte an der Marke gekauft. Daher solltest du definitiv klären ob du die Marke in deinem Trailer nutzen darfst oder nicht. Du solltest auch schauen ob es gewisse Richtliniengibt zur Darstellung der Marke (Brandguide, Abstände, Farben, etc.).


    Auch ist es nicht so, dass wenn du z.B. "Unreal Engine" in deinem Trailer nennst, Werbung für die Unreal Engine machst. Der Gegenteil ist hier eher der Fall: Du nutzt die Marke "Unreal Engine", um Werbung für dein Produkt zu machen.


    TLDR: Du musst nach Erlaubnis fragen und dich mit deren Regeln vertraut machen.


    BTW: Es gibt auch viele Firmen die ihre Guidelines zur Nutzung der Trademark öffentlich bereitstellen: Hier z.B. die Unreal Engine (nicht das Epic Logo, dies ist wahrscheinlich schwieriger zu nutzen, da das Epic Logo die Firma selbst repräsentiert):

    https://www.unrealengine.com/en-US/branding

    Z.B. steht hier unter anderem, dass du ein Formular ausfüllen und an Epic schicken musst. Epic schreibt hier auch klar, dass sie die Nutzung der Trademark untersagen können, falls das Produkt nicht mit Epics eigenem Image konform ist.


    Es gibt viele Firmen die sowas haben. Wenn du es nicht findest, kannst du einfach nachfragen.

    Also std::string funktioniert nicht zwischen interop Grenzen, da ein C# System.String und ein C++ std::string einen anderen Aufbau haben. Daher ist char* schon der richtige interop freundliche typ. Kenne mich leider nicht zu gut in dem Gebiet aus, also kann ich nicht mehr beitragen.

    Ich würde mal einfach vorschlagen auf auf stackoverflow zu suchen.

    Du solltest wenn du an der Code/BP stelle nicht 100% sicher sein kannst, dass in der Variable auch etwas ungleich NULL steht immer zuerst prüfen ob der Inhalt der Variable Valide ist.

    Dazu kannst du den IsValid-Node nutzen. Davon gibt es 2 Varianten. Eine gibt einen Bool zurück, eine ist direkt ein Branch. Den letzteren würde ich eher empfehlen, da du so sicherstellst, dass der Execution Path klarer ist.


    Is Valid checkt ob eine Objekt variable nicht Null ist, oder der inhalt nicht auf "pending Kill" gesetzt ist und demnächst vom Garbage Collector gekillt wird.


    Wie du dann vorgehst ist dir überlassen. Du musst festlegen was passieren soll, daher auch die Fehlermeldung. Dazu hast du folgende Möglichkeiten:

    a) Die Ausführung der Funktion endet beim Fehlschlag. Dies ist sinnvoll wenn die Ausführung ohne validen inhalt keinen Sinn ergibt.

    b) Der Grund des Fehlers wird behoben. D.h. wenn z.B. eine Objekt Variable die geprüft wurde nicht Valid ist, dann könnte man ja einfach ein neues Spawnen und dann weiter machen. (Macht natürlich nicht immer sinn)

    c) Man geht über auf eine Ersatzlösung die das Objekt nicht benötigt. (Vielleicht gibt es ja eine andere Lösung oder eine Approximation)

    d) Man kommt in einen ganz anderen Pfad. Dies ist sinnvoll wenn die Validität das verhalten der Funktion grundlegend beeinflussen soll.

    e) Es wird ein Fehler ausgespuckt, am besten mit einer Fehlermeldung die genügend Informationen hergibt um das Bug Hunting so einfach wie möglich zu machen. (In der Releaseversion gibt es die Meldung nicht.) Kleiner Tipp: Je kritischer der Fehler desto nerviger muss es sein, damit man auch einen Anreiz hat den Bug zu fixen. (Hab aber auch mal mit Experten zu tun gehabt, die das ganze fixen indem sie die Fehlermeldung raus programmieren, Problem war natürlich, dass der Bug nicht weg ist ...)


    Bei deinem Problem kann ich mir vorstellen, dass du Ghost Building nicht vernünftig gesetzt hast, bzw. die RTS Cam versucht auf GhostBuilding zuzugreifen, nach dem es zerstört wurde, aber noch kein neues Ghost Building gespawnt wurde.

    Eine Struct kann auch als Array gesetzt werden. Dann sind alle Elemente eine Struct.

    Aber wir können ja auch weg vom Struct. Das selbe ist ja auch mit ein normalen Array. zB Float.

    Sagen wir mal so, 10 Elemente als Float sind in ein Array und das Array ist repliziert. Die 10 Elemente werden alle mit ein ForEachLoop gelesen. Wird jetzt 10 mal einzelnd repliziert, oder nur einmal das ganze array repliziert und dann gelesen. Evtl ist die Frage auch überflüssig, wenn alle Elemente, egal wie, einzeln gesendet werden.

    Ich glaube, Tomarr hat es einfach falsch verstanden, weil die ausdrucksweise etwas holprig ist.

    Bei dem was du beschreibst handelt es sich um einen "Array of Structs".

    Bei dem Satz "Eine Struct kann auch als Array gesetzt werden" könnte man denken, dass du ein struct in ein Array wandeln willst, oder sonst etwas. Es gibt sogar sprachen wo es geht, wobei dort die Array sich eher wie Maps verhalten (Zugriff über einen Key, statt einem Index.)

    Moin, hab das sicherlich schon mal gefragt, aber irgendwie bin ich mir unsicher bei mein jetziges Verfahren.

    Wenn ich das richtig beobachtet habe, werden alle Variable in einer Struct repliziert, egal ob man nur eine Variable verwendet.

    Aber was ist mit ein Array? Wenn ich ein Array komplett durchlaufe, zB eachLoop, werden alle Elemente hintereinander repliziert, oder wird einmal ein Array repliziert und dann local durchsucht?


    mfg EKI

    Ist etwas schwer für mich das genau zu erklären aber folgendes weiß ich:

    Variablen Replication findet soweit mir bekannt ist nicht statt, wenn sich ein Wert ändert, sondern, wenn ein "Dirty" state festgestellt wird. D.h. wenn der server, während er prüft, was er replizieren muss, merkt, dass sich die Variable zum vorher replizierten Stand verändert hat. Genrell müsste der Check am Ende des Frames sein, d.h. es zählt der Status den deine Variable am Ende des Frames hat.


    Soweit ich mich erinnern kann sollte auch die Array Replication halbwegs intelligent sein und nicht immer alles replizieren den kompletten Array übertragen, sondern nur die Änderung. [Quelle] Da müsstest du aber noch einmal Recherchieren. Bei structs sollte es auch so sein dass nur die member übertragen werden die sich verändert haben. [Quelle]

    Sind beides aber keine direkten Epic aussagen, aber jeweils von Entwicklern die recht fit in UE4 sind.

    Das ganze kann dir aber in Blueprint egal sein, denn auf die Tiefe, welches Element oder welcher Member in der entsprechenden Replikation verändert wurden hast du keinen zugriff. Als BP Entwickler weißt nur nur, dass entsprechendes struct/array repliziert wurde.


    Generell versuche ich persönlich Array Replication zu vermeiden, außer es handelt sich um etwas was nur wenige Male repliziert wird.