Funktion des Characters auslösen, wenn sein Projektil getroffen hat???

  • Da bin ich wieder, grüßt euch liebe Programmierer.


    Ich habe einen Character mit einer Funktion(A), dieser Character spawnt irgendwann einen Actor(Projektil).

    Über den Actor(Projektil) soll nun irgendwann die im Character enthaltene Funktion (A) ausgeführt werden.


    Der Character ist natürlich Besitzer vom Actor(Projektil).


    Weiß einer, wie man das macht?

  • Du kannst das OnActorHit-Event (https://docs.unrealengine.com/…tor/OnActorHit/index.html )des Projektils binden und dann die Funktion aufrufen.


    Also entweder über das BeginPlay des Projektils

    Code
    // Achtung nur aus dem Kopf, noch nicht kompiliert
    OnActorHit.AddDynamic(GetOwner(), &DeineCharacterKlasse::OnProjectileHit);

    oder in der Spawn-Funktion des Chars

    Code
    // Achtung nur aus dem Kopf, noch nicht kompiliert
    Projektil->OnActorHit.AddDynamic(this, &DeineCharacterKlasse::OnProjectileHit);


    Die OnProjectileHit muss dann natürlich die Funktionssignatur des OnActorHit Events haben

  • @freezernick, danke für den Versuch, aber das ist nicht das was ich meine.

    Nochmal:

    Der Charakter hat eine Funktion ,,void test()'' inne.

    Der Charakter spawnt einen Actor.

    Dieser Actor macht irgendetwas, egal was, soll dann die Funktion ,,void test()'' vom Character auslösen lassen.

    Weil der Actor das Eigentum von Character ist, kann man daher vllt den Bezug herstellen.


    jetzt vllt klarer? Vllt ist die Frage sogar zu einfach, aber ich komme auch gerade nicht darauf.

  • Ich habe das so geschrieben, weil du ja im Titel gesagt hattest, dass du eine Funktion im Character auslösen willst, sobald das Projektil trifft, und genau das passiert mit meinem Code-Beispiel.

    Und ja, wenn du einen Owner definiert hast, kannst du mit GetOwner() diesen Actor bekommen, aber auch das hatte ich schon in meinem Beispiel.

    Solange die Funktion public ist oder das als friend definiert ist, kannst du ja machen was du willst.


    https://docs.unrealengine.com/…Actor/GetOwner/index.html



    Edit: Und wenn du die void Test() beim Auftreten des Projektils aufrufen willst, dann machst du halt entweder ein Event-Binding für das OnActorHit-Event und rufst da Test() auf, ist ja kein Problem. :)

  • ah, ich versteh jetzt, kriege es aber irgendwie nicht kompiliert leider. Schau mal vllt hier.


    //MeinCharacter.h

    void LK();

    void LoestSchadenTextAus();


    //MeinCharacter.cpp

    void AMeinCharacter::LK()

    {

    AKugel* TempKugel = GetWorld()->SpawnActor<AKugel>(KugelKlasse, WaffeOrt, KombiRichtung);

    TempKugel->SetOwner(this);

    }

    void AMeinCharacter::LoestSchadenTextAus()
    {
    NewPoints.Broadcast(Points);
    }



    //Kugel.h

    class AMeinCharacter;


    //Kugel.cpp

    #include "MeinCharacter.h"


    //in BeginPlay

    OnActorHit.AddDynamic(GetOwner(), &AMeinCharacter::LoestSchadenTextAus);


    //Will nicht kompilieren, das kommt als Message in den Log, vlllt erkennst schnell den Fehler.



    [1/6] Kugel.cpp

    C:\Users\David\Documents\Unreal Projects\MeinGame\Source\MeinGame\Kugel.cpp(29) : error C2664: "void TSparseDynamicDelegate<FActorHitSignature_MCSignature,AActor,FActorHitSignatureInfoGetter>::__Internal_AddDynamic<AActor>(UserClass *,void (__cdecl AActor::* )(AActor *,AActor *,FVector,const FHitResult &),FName)" : Konvertierung von Argument 2 von "void (__cdecl AMeinCharacter::* )(void)" in "void (__cdecl AActor::* )(AActor *,AActor *,FVector,const FHitResult &)" nicht m?glich

    with

    [

    UserClass=AActor

    ]

    C:\Users\David\Documents\Unreal Projects\MeinGame\Source\MeinGame\Kugel.cpp(29): note: Die Typen, auf die verwiesen wird, sind nicht verkn?pft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.

    C:\Program Files\Epic Games\UE_4.25\Engine\Source\Runtime\CoreUObject\Public\UObject/SparseDelegate.h(359): note: Siehe Deklaration von "TSparseDynamicDelegate<FActorHitSignature_MCSignature,AActor,FActorHitSignatureInfoGetter>::__Internal_AddDynamic"

    [2/6] MeinCharacter.gen.cpp

    [3/6] MeinCharacter.cpp

  • Du musst dir das AddDynamic() vorstellen, wie das OnHit-Event in Blueprints: Da sind auch schon ein paar Parameter dabei, die braucht man zwar nicht verwenden, aber sie sind da.

    So ist das auch in C++: Event-Handler müssen dieselbe Funktionssignatur wie das Event selbst haben, also in diesem Fall:

    void LoestSchadenTextAus(AActor* SelfActor, AActor* OtherActor, FVector NormalImpulse, const FHitResult& Hit);

  • Eigentlich würde man das so machen, wenn dein Actor A der Parent von Actor B ist:

    Cast<UDeineCharacterKlasse>(GetOwner())->LoestSchadenTextAus();


    Wenn du aber das beim Auftreffen des Projektils haben willst, musst du ja so oder so ein Event-Binding machen.


    Und das wäre halt so


    ODER:

  • Da weiß ich jetzt ehrlich gesagt nicht, was ich dazu sagen soll ^^

    Eigentlich war mein Plan mit meinem neuen Rechner ein paar Coding-Livestreams zu machen, nur ist er leider schon defekt angekommen. :(
    Vielleicht sparst du dir das Geld und wir warten, bis er repariert ist. Dann kannst du da Fragen stellen?

    Aber du kannst mich auch meinetwegen per Discord (freezernick#4930) oder E-Mail (freezernick@f2p-entertainment.de) kontaktieren =)