Beiträge von Phoenix-100

    Hey zusammen


    Sieht wirklich cool aus. Das Level design und Grafik gefallen!

    Die Szene im Kampf ist aktuell etwas trist, vor allem im Kontrast. Das ist aber sicher noch ein Placeholder.

    Ich hoffe du bleibst dran und erzählst ein paar tolle Geschichten. Freue mich jetzt schon auf Updates!


    Gruss

    Hallo


    Ja das Multiplayer Networking und Remote Control web server sind komplett verschiedene Dinge.

    Der Remote Controler Web Server sollte auch nicht offen für das Internet sein.


    1. Das macht alle die Engine für dich. Du musst nur noch den server starten mittels:

    WebControl.StartServer<br>

    Es ist wirklich nur ein lokaler web server. Du kannst diesen gut benutzen um mittels REST funktionen aufzurufen mittels JSON.

    Vergiss aber nicht das Plugin zu aktivieren. Der Server hört dann auf 127.0.0.1:30010.

    Dein Companion app könnte dann von mir aus relativ simpel einfach funktionen aufrufen und daten lesen.


    2. Die sind für Multiplayer games, auch über das Internet. Das ist vermutlich nicht was du willst. Aber auch hier brauchst du keine extra Software.


    Gruss

    und er spuckt mir ständig nur 1 aus.

    Das Array müsste doch größer oder kleiner werden, je nachdem ob einer in Sichtweite kommt oder die Sichtweite verlässt.

    Kann mir das einer erklären???

    Nein, UpdatedActors sind nur die Actors die ein Update erhalten haben. Das ist unabhängig davon ob in Sichtweite oder nicht.


    Gruss

    Welcher Teil?

    Code
        TArray<AActor*> OutActors;
        PerceptionComponent->GetCurrentlyPerceivedActors(Sight->GetSenseImplementation(), OutActors);

    Das snippet speichert dir alle aktuell wahrgenommene Actors im OutActorts Array. Das sind alle Actoren aktuell im Sichtfeld.


    Dann können wir über diese im Sichtfeld befindenen Actoren durch loopen, dann printe ich jeden einzelenen Name davon auf den Screen.

    Code
        for (AActor* OutActor : OutActors)
        {
            GEngine->AddOnScreenDebugMessage(-1, 2.0f, FColor::Red,
                                             FString::Printf(TEXT("I can see you %s"), *OutActor->GetName()));
        }

    Das war auch schon.

    OnPerceptionUpdated wird nicht nur dann aufgerufen, wenn etwas neues wahrgenommen wird, sondern auch dann, wenn etwas, das wahrgenommen wurde nicht mehr wahrgenommen wird.


    Also vereinfacht, es wird aufgerufen, wenn es ins Sichtfeld tritt und erneut wenn es das Sichtfeld wieder verlässt.

    Du kannst in deiner Update Methode alle wahrgenommenen Actor ausgeben lassen.


    Hallo


    Der Perceptioncomponent hat Multicast Delegates die die nutzen kannst. Hier der Sourcecode davon.

    Code
    DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FPerceptionUpdatedDelegate, const TArray<AActor*>&, UpdatedActors);
    FPerceptionUpdatedDelegate OnPerceptionUpdated;


    Dieses Deleagte wird im ProcessStimuli vom PerceptionComponent broadcasted. Vereinfacht dann, wenn sich etwas relevantes im Sichtfeld verändert.


    Du musst also deine Update methode dem Delegate hinzufügen.

    Code
    PerceptionComponent->OnPerceptionUpdated.AddDynamic(this, &AMyCharacter::PerceptionUpdated);

    Wenn sich nun etwas im Sichtfeld verändert, wird deine PerceptionUpdates Methode aufgerufen. Das heisst, du weisst immer, was du gerade siehst.


    Gruss

    Die IDE sollte dadurch nicht crashen, lediglich die Engine. Hot Reload ist sowieso ziemlich fehleranfällig, was das compilieren aus der IDE sinnvoll macht und damit wird sowieso ein neustart aus der Engine notwendig.


    Aber nochmal, die Engine crashed im Beispiel so oder so, sie crashed nun einfach früher.


    Meistens handelt es aber nicht um fatale Fehler, und hier kannst du ensure nutzen, dann crashed die Engine nicht und du hast den Error im output log.


    Gruss

    Hey zusammen


    Ich glaube aber irgend wo konnte man die Size einer Textur direkt in Unreal runterstellen. Ich hab das aber aus den oben genanten gründen noch nie gemacht.

    Vielleicht weiß dass jemand anderst


    Man kann in den Texture settings den LOD bias hoch stellen. Hier ein Beispiel, dass diese normal map von 2K auf max 1K runter schraubt.


    Doch ich verstehe. Genau das soll passieren. Wir sind in einem Zustand der nicht sein darf, fatal, keine Erholung möglich. Anstatt das jetzt durchzuschleppen und dann beim nullptr oder was auch immer zu crashen, crashen wir lieber gleich beim check. Der Programmierer findet so schneller sein Fehler und wir crashen kontrolliert.


    Du hast schon recht, das ist vermutlich seltener der Fall. Häufiger hast du ensure, dann crashed die Engine nicht, eben für nicht fatale Zustände. Du musst aber natürlich sicherstellen, dass du das auffängst.

    Beispiel: Ich habe hier einen nullptr gebaut. Nun wird geloggt, wo genau der aufgetreten ist mit dem stack.

    Crashen tut die Engine hier nicht.


    Code
        AActor* MyPointer = nullptr;
    
        if (ensure(MyPointer))
        {
            MyPointer->GetName();
        }

    Nun, wenn der Wert nicht = 0 ist funktioniert es, wenn der Wert gleich 0 ist stürzt die gesamte Engine ab.

    Genau so ist, das ist die Konsequenz. Nun crashed die Engine. Der Entwickler sieht nun in welcher Zeile welcher check fehlgeschlagen hat und nun kann das repariert werden. Ziel erreicht oder nicht? Wenn du nicht möchtest, dass die Engine crashed kannst du ensure nutzen.


    Try... Catch funktioniert nicht, weil die Engine keine Exceptions benutzt, was dann mein gewohntes Umfeld wäre. Also bleibt wirklich nur das, was ich von Anfang an gemacht habe.

    Check und ensure empfinde ich da in jedem Fall als überlegen. Ich verstehe nicht wieso die selber basteln müssen. Die asserts sind ideal zum Absichern der Annahme in der Methode und bieten umfangreiche Möglichkeiten.


    Kannst du genauer beschreiben was dich stört?

    Hey zusammen


    Häufig ergeben sich die Paramter einer Blueprit Node zur Laufzeit, das beduetet eine Prüfung zur Compile time ist häufig gar nicht möglich.

    Der übliche Ansatz sind Asserts, wenn durch null dividert wird, wird bei check die Ausführung unterbrochen und in der IDE genau die Zeile geöffnet, wo das passiert ist.

    Ansonsten hast du den Stack auch zur Verfügung, mit der Nachricht vom Ensure und der Zeile wo es passiert ist.


    Code
    LogOutputDevice: Error: === Handled ensure: ===
    LogOutputDevice: Error: Ensure condition failed: B != 0 [File:.../Private/ActorComponentB.cpp] [Line: 37]
    LogOutputDevice: Error: Division by Zero
    LogOutputDevice: Error: Stack: 


    Der Ansatz ist es diese ungültigen Zustände zu finden. Also bei einer Division geht man davon aus, dass der Programmierer da nicht durch null teilt. Falls doch wird die ausführung unterbrochen, und der fehlerhafte Code angzeigt und das Problem kann behoben werden. Deine Log message könnte halt übersehen werden, ein check nicht.


    Du kannst try - catch blocks nutzen. Die Engine nutzt diese kaum. In diesem Beispiel sehe ich da auch kein Vorteil von Exception, weil es halt ein Programmierfehler ist.


    Gruss

    Kann ich nach 3 Zahlen Statt Punkt einen Komma setzen?

    Deine Frage war, wie man den Punkt durch ein Komma ersetzen kann, die Antwort ist die replace node.


    Weiß einer wieso ich immer das € zeichen sehe, obwohl ich "G" reinschreibe? Würde das Währungszeichen durch das M ersetzen, dann würde es passen, aber das Währungszeichen ändert sich nicht.


    G ist keine Währung.


    Je nach eingestellter Kultur werden zahlen in der Unreal Engine anderst formatiert. Du kannst das natürlich umgehen und einfach selber die Zahl in dreigruppen unterteilen, und dann dort dazwischen schreiben was immer du willst.


    Gruss

    Mittels der Kismet String Library. Du willst die "replace" node auf dem String nutzen, dort einfach , durch . ersetzen.

    In Blueprint einfach String eingeben und dann hast du eine riesen Auswahl :)


    Hey zusammen


    Es geht ja nur um die Darstellung, das kannst du mittels string formatieren wie auch immer du willst.

    Für ultra grosse zahlen kann man auch structs nutzen. Für Million, hunderter, zehntausender Stelle jeweils ein eintrag oder double in c++.


    Gruss

    Hey zusammen


    Du kannst es machen wie im alten Shooter Game example, oder das neue in der UE5 anschauen.


    Den Network part lasse ich mal aus.

    Und dann die berechnung beim Refire

    Gruss