Beiträge von Phoenix-100

    Hey zusammen

    Aber du erstellst eigentlich niemals ein Baseobjekt, welches mal eine Wand, mal eine Waffe, mal eine Kuh oder so sein kann.

    Da muss ich dir widersprechen. Die Unreal Engine macht nämlich genau das.

    Egal was du in der Engine erstellst, du erbst eig. so gut wie immer von UObject.

    Alles erbt davon, egal ob du eine Wand, eine Waffe oder eines der über 6000 weiteren Children erstellst.

    Es kann also durchaus Sinn machen.


    Gruss

    Du meinst vermutlich das Gizmo Coordinate System in World oder Coordinate Space.

    Es ist der Button oben rechts der wie eine Welt oder Box aussieht (je nach aktivem Modus).

    Ich kann leider keine Bilder einfügen, aber hier siehst du es.

    Hey zusammen


    Ja das kannst du mit den Scalability Settings.


    Scalability Reference
    Scalability options, properties, and console variables.
    docs.unrealengine.com


    Oder mit commands, hier zum Beispiel für die Schatten Qualität:

    sg.ShadowQuality 0

    0 also Qualität low.


    Wenn man an einem Spiel bastelst, muss man mit den Ressourcen haushalten. Üblicherweise will man ja, dass das Spiel auch auf schwächeren Rechnern gut läuft. Entsprechend empfehle ich grundsätzlich eher das Projekt zu optimieren, statt RAM nachzurüsten.


    Gruss

    Hallo zusammen


    Beheben kannst du dass in der Unreal Engine nicht dass muss du in einem 3D Programm machen.


    Du kannst das direkt in der Engine machen. Dazu wählst du oben links den Modeling Mode aus. Dann dein Objekt auswählen und dann links unter UVs AutoUV auswählen, für den Anfang. Du kannst natürlich auch manuell die Seams auswählen.


    Dann kannst du auch das tiling in deinem Material anpassen.


    Gruss

    Hallo


    Mein Code entfernt die nullptr aus dem Array. Also behält nur Elemente bei denen das true ist.

    Code
    return A1 != nullptr;

    Dein nullptr ist vermutlich entweder AIController_Minion oder GetBlackboardComponent().

    Die prüfst du beide nicht. Mit ensure und check findest du diese Probleme einfacher, und sonst einfach mit dem debugger.


    Code
     MeineMinions[i]->AIController_Minion->GetBlackboardComponent()->SetValueAsObject("Spieler", this);


    Gruss

    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();
        }