Beiträge von JonnyMachony

    Hi jungens, ich tue mich noch schwer zu erkennen, wann ich dereferenzieren "*..." soll und wann nicht, hat da jemand ne gute Erklärung?


    Hier ein Beispiel:


    Code
    IOnlineSubsystem* OnlineSubsystem = IOnlineSubsystem::Get();
    if (OnlineSubsystem)
    {
         if (GEngine)
         {
         GEngine->AddOnScreenDebugMessage(-1, 15.f, FColor::Yellow, FString::Printf(TEXT("found subsystem: %s"), *OnlineSubsystem->GetSubsystemName().ToString()));
         }
    }


    Im Beispiel wird ja "*OnlineSubsystem" ja durch das "*" dereferenziert.

    Da "OnlineSubsystem" ein Pointer ist und somit eine Adresse innehat, wird durch das Dereferenzieren der Pointer nun wieder einen Wert ausgeben, versteh ich richtig so?


    Kann das Rereferenzieren noch etwas anderes? Kann es auch auf eine normale Variable angewendet werden um wieder die Adresse der Variable wiederzugeben? Kann das Rereferenzieren noch etwas anderes?

    Hi Jungens,

    bin bisschen verwirrt gerade, mein bisheriges Wissen war:


    Eine Variable z.B "A" wird erstellt, diese kann einen Wert zugewiesen bekommen.


    Dann gibt es Pointer z.B "A*", diese sind nur die Adressen zu dieser Variable, ein Pointer hat also keinen Wert, er ist nur der "Link" zu dieser Variable.


    Was ist jetzt nochmal dann eine Referenz ??? also das hier "&A" ???


    vielen dank schonmal.



    Dann weiß ich noch, man kann Pointer Dereferenzieren, also schreibt man "*A" , so wird aus dem Pointer wieder der Wert von A wiedergegeben. Soweit richtig alles?

    Phoenix-100 , danke für deine Antwort, ich versteh deinen Code leider nicht und mein Problem besteht immer noch, kannst du vllt das mit meinem bisherigen Code erklären, dieser Crasht auch, obwohl ich nach validen Pointern filtere.


    Ich nehme doch aus meinem Array "MeineMinions" jedes Element heraus mit einer for-Schleife und prüfe es mit "if (MeineMinions[i])", wieso kann es dann noch crashen?


    Code
    if (MeineMinions.Num() > 0 && Minion && Minion->AIController_Minion)
    {
        for (int32 i = 0; i < MeineMinions.Num(); i++)
        {
            if (MeineMinions[i])
            {
                MeineMinions[i]->AIController_Minion->GetBlackboardComponent()->SetValueAsObject("Spieler", this);
            }
        }
    }

    evtl ist dies der Code dafür. Stimmt das?


    Code
    ArrayName.Sort();


    Beim rumprobieren ist mir aufgefallen, dass mein Projekt öfter abstürzt.


    Zweite Frage also, wie stelle ich sicher, dass ein Array mindestens ein valides Element noch inne hat?


    bei einzlenen Pointern macht man das ja so


    if (PointerName)

    {

    }


    wie macht man das bei Arrays voller Actoren?


    Danke schonmal.

    Hi Jungens, ich habe also ein Array voll von Actoren.


    Wenn ein Actor davon stirbt, wird er zum Nullpointer.


    Kann ich also das Array irgendwie sortieren, dass die gefüllten Elemente im Array nach vorne geschoben werden und die Nullpointer Elemente nach hintern. So dass wenn ich das Array Element [0] aufrufe, immer ein gefüllter Actor drin ist?


    Bin mit Arrays noch nicht so fit, kann man das machen?

    Hi Jungens, gibt es einen Weg zwei Animation Montages unabhängig voneinander zu verwenden?


    Ich habe z.B einen AICharacter, er startet eine SchlagSerie mit Hilfe einer AnimationMontage, während dieser SchlagSerie wird er von der Seite angegriffen und er spielt nun seine Treffer AnimationMontage.


    Problem dabei ist, dass er nun seine SchlagSerie unterbricht und auch nicht mehr fortsetzt. Irgendwie hat seine Treffer Animation seine SchlagSerie Animation unterbrochen und auch beendet.


    Ich habe gedacht, wenn ich AnimationMontage so nutze, dass die auf verschiedenen Slots laufen und auch in den Slot Nodes hintereinander stehen im AnimGraph, dass sie beide unabhängig voneinander funktionieren.


    Hab ich etwas vergessen oder ist das garnicht möglich bzw. wie macht man es dann möglich dass man während einer AttackenNahkampfSerie eine Treffer Animation auch mit einspielen kann?


    danke euch schonmal.

    Jungens, die Funktion, die ausgeführt wird, wenn ein Gegner gesichtet, wird so eingebunden:


    Code
    PerceptionComponent->OnPerceptionUpdated.AddDynamic(this, &AAIController_Minion::AIWahrnehmungUpdate);


    Zu dieser meinen Funktion:


    Code
    void AAIController_Minion::AIWahrnehmungUpdate(const TArray<AActor*>& UpdatedActors)
    {
    
    
    }


    Sie wird ausgeführt, wenn ein neuer Gegner ins Sichtfeld hineinkommt oder hinausgeht, das Array enthält die gesichteten Gegner.


    Meine Frage: kann ich diese meine Funktion auch irgendwie selber aufrufen lassen?

    Weil mein NPC tötet einen Gegner und tut dann nix mehr, obwohl er noch andere Gegner erkannt hat, ich bekomme mein NPC nicht mehr dazu, die WahrnehmungsFunktion nochmal auszuführen.


    Das einzige was mir eingefallen ist, den NPC, nach dem Tot des ersten Gegners, sich selber drehen zu lassen, dadurch kommt der 2. Gegner auch aus der Sicht heraus und dann tickt diese meine Funktion wieder, aber das ziemlich ne blöde Lösung.


    Alle NPC´s drehen sich ständig nach dem ersten Gegner um weitere NPC zu suchen.^^

    Ich dachte eher an den Owner, bzw. den Besitzer, von welchem Actor dieser Actor gespawnt wurde. Kann man das auch irgendwie abfragen?

    Beispiel: ein Granate wird von einem Spielger gespawnt, wie kann ich in der Granate jetzt abfragen, von welchem Spieler diese Granate jetzt gespawnt wurde?

    hm, hab ich auch gedacht, aber wenn ich das

    Code
    GetOwner();

    bei meinen gespawnten Character mache, dann gibt der mir sein AIController zurück, statt sein Besitzer, der ja eigentlich der SpielerCharacter sein sollte.


    So frage ich z.B das im gespawnten Character in seiner BeginPlay() Funktion ab:


    Code
    UE_LOG(LogTemp, Warning, TEXT("ich gehöre: %s"), *GetOwner()->GetName());

    ich habe das

    Code
    Super::BeginPlay(); 

    im AIController vergessen, jetzt läuft es. Aber warum ist diese Zeile so wichtig, ist mir noch ein Rätsel, sie ruft wohl die ElternFunktion auf? Warum ist das notwendig?

    Meine BeginPlay Funktion spielt doch auch so oder?

    AI hat im Blackboard ein Vektor, mit gefüllten Daten, will sich aber mit dem vorgefertigten MoveTo Node trotzdem nicht dahin bewegen.


    NavMeshBoundsVolume ist da.

    BehaviorTree führt auch aus.

    AI Module "NavigationSystem", "AIModule" in .Build.cs auch hinzugefügt.


    was anders ist, es ist ein im Spiel gespawnter AI Character. Hier paar Bilder, einer ne Idee?