Wo ist mein Denkfehler?

  • Ich mache eine BeginOverlap Funktion, hole den gegnerischen Char daraus.

    Diesen Char packe ich in eine Funktion.

    Ich erstelle eine Funktion die ausgelöst wird bei auslösen von Taste F.

    Diese Taste F Funktion holt den gegnerischen Char und ruft eine Funktion von diesem Char aus.


    in .cpp

    void AMyCharacter::BeginBoxOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult & SweepResult)

    {

    }

    AMyCharacter* AMyCharacter::GibtGegner(AMyCharacter* Char)

    {

    Code
    return Char;

    }

    void AMyCharacter::F_Taste()

    {

    Code
    if (FinisherMontage)
    
    {
    
    GibtGegner()->PlayAnimMontage(FinisherMontage, 1.f, FName("KO"));
    
    }

    }

    in .h

    Code
    AMyCharacter* GibtGegner(AMyCharacter* Char);


    Vielen Dank für die Antwort schonmal. Außerdem suche ich jemanden, der mir hier und da C++ Fragen beantworten kann.

    • Hilfreich

    Du speicherst MeChar nie in einer Variable oder sonst wo ab. Deine Funktion GibtGegner macht rein gar nix außer den übergeben Parameter direkt wieder zurück zugeben und ist so in dieser Form relativ Sinnlos. In der Funktion F_Taste wird es dementsprechend auch krachen, wenn du GibtGegner aufrufst, da du den Parameter übergeben musst.


    Desweiteren würde ich dir empfehlen nicht direkt die Taste F zu nutzen, sondern die Action bzw. Axis Mappings für Input zu nutzen, wenn du das nicht sowieso schon tust. Außerdem würde ich dir Englischer Variable und Funktionsnamen empfehlen.

  • @Stephan ich hab nun versucht die Variable zu speichern, geht trotzdem nicht, hier der Code, hab kein Plan was ich nicht verstehe.


    in .h

    UPROPERTY()
    AMyCharacter* EnemyCharacter;

    in .cpp

    void AMyCharacter::BeginBoxOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult & SweepResult)

    {

    }

    void AMyCharacter::F_Taste()

    {

    Code
    if (FinisherMontage)
    
    {    if (EnemyCharacter)
        {
        EnemyCharacter->PlayAnimMontage(FinisherMontage, 1.f, FName("KO"));
        }
    
    }

    }

  • Stephan ich hab nun versucht die Variable zu speichern, geht trotzdem nicht, hier der Code, hab kein Plan was ich nicht verstehe.

    Geht nicht ist keine Ausreichende Antwort bzw keine mit der ich was anfangen kann und eine Glaskugel besitze ich leider auch nicht.


    Bekommst du einen Fehler oder fallen Birnen vom Himmel? Was funktioniert nicht? Kennt er die Variable nicht, ist das in 2 Unterschiedlichen oder die selbe Klassen? Ist FinisherMontage vielleicht nicht gesetzt?

  • Es scheint so, dass er nicht in diese If Abfrage reinkommt, ich nehme an, EnemyCharacter wird nicht gefüllt, verstehe aber nicht warum. Also es lässt sich kompilieren, aber in dieser If Abfrage komme ich nicht hinein, bzw. von da aus bekomme ich auch kein UE_Log aufgerufen.


    Code
    if (EnemyCharacter)    {    EnemyCharacter->PlayAnimMontage(FinisherMontage, 1.f, FName("KO"));
  • Stephan

    Cast klappt, hier der Code: Der Pointer "EnemyCharacter" ist in der "F_Taste" Funktion NULL, obwohl er erfolgreich in "BeginOverlap" gesetzt wurde.


    ```

    in .h

    UPROPERTY()

    AMyCharacter* EnemyCharacter;

    ```


    ```

    in .cpp

    void AMyCharacter::BeginBoxOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult & SweepResult) {

    if (OtherActor != this)
    {   

    AMyCharacter* MeChar = Cast<AMyCharacter>(OtherActor);

    if (MeChar)       

    { EnemyCharacter = MeChar;

    UE_LOG(LogTemp, Warning, TEXT("drin"));

    UE_LOG(LogTemp, Error, TEXT(" %s"), *AActor::GetDebugName(EnemyCharacter));

    }

    }
    }


    void AMyCharacter::F_Taste()
    {

    UE_LOG(LogTemp, Warning, TEXT("FTaste gedrückt"));

    UE_LOG(LogTemp, Error, TEXT(" %s"), *AActor::GetDebugName(EnemyCharacter));

    if (FinisherMontage)

    {

    if (EnemyCharacter)

    {

    PlayAnimMontage(FinisherMontage, 1.f, FName("Start"));
    EnemyCharacter->PlayAnimMontage(FinisherMontage, 1.f, FName("KO"

    }

    }

    }