Cast to (object)?

  • Hallöchen,

    ich hätte da mal eine Frage die wahrscheinlich jeder mal hatte. Wie genau funktioniert die "cast to" Funktion. Ich denke ich habe hier ein allgemeines ding noch nicht richtig verstanden. Teilweise frage ich mich einfach was in den "object" Input herein muss.

    Verbessert mich wenn ich das so falsch verstanden habe:


    In das "Object" muss eine Referenz von dem sein, wo ich hin Casten möchte. Sprich möchte ich eine Variable aus einem anderem BP haben, muss diese dort irgendwo verwendet sein.


    Hier denke ich das ich das nicht wirklich richtig verstanden habe. Sitze gerade schon wieder an den Punkt nicht zu wissen was ich da rein stecke. Manchmal klappt es mit einem PlayerController/Pawn/Owner und eben die anderen ;D


    Gehen wir mal von meinem Beispiel aus.

    Mein Fahrzeug hat sich auf die Seite gelegt, nun muss es wieder resetet werden. Dazu möchte ich aber die Ladung auf meiner Ladefläche nicht Simulaten (würde sonst einfach durch das Fahrzeug fallen im Reset fall) Daher Caste ich zu meinem Item und setze Simulate Physics auf false. Nach einem kleinen Delay wird die Geschichte wieder auf True gesetzt und mein Fahrzeug steht wo es soll.



    Nun wieder zu meiner Frage... Ich habe keine Referenz für meine Physics die ich da in diesen blöden Input bekommen könnte^^

  • Ich muss zugeben, dass ich den Zusammenhang zwischen deinem Beispiel und deiner Frage zu Cast To nicht richtig verstanden habe. Aber ich versuche es mal zu erklären, so wie ich zumindest das Cast To verstehe. Muss aber nicht zu 100 % richtig sein.


    Ich habe Cast To auch lange Zeit nicht verstanden, weil irgendwie fühlte es sich wie eine Programmierung an, die man in Sprachen wie C# oder ähnlichem so nicht umsetzt, ja sogar ein absolutes No-Go wäre. Nun habe ich vor kurzem aber Begonnen C++ zu lernen.


    In C++ hast du verschiedene Klassen und Bibliotheken. Diese bindest du in der Regel mit

    Code
    #include <std>

    ein. Dies ist jetzt die Standardbibliothek mit der eben halt so gewisse Grundfunktionen im Programm zur Verfügung stehen, zum Beispiel cout für Konsolenausgaben.


    Wenn du das so einbindest, hast du aber ein Problem. Zum einen bindest du alles ein, was in dieser Bibliothek vorhanden ist. Zum anderen kannst du ja eigene Klassen und Bibliotheken erstellen, die du ebenfalls einbinden kannst. Und wenn du dann eine Variable, Funktion oder ähnliches hast, die die gleiche Bezeichnung hat wie in der Standardbibliothek gehst du besser so vor... Du lässt das include weg und schreibst vor jedes cout folgendes...

    Code
    std::cout << "Hello World";

    Dann gibst du explizit an, dass du das cout aus der Standardbibliothek verwenden willst und nicht eventuell eins aus einer anderen Bibliothek. Auch, wenn es dann halt mehr Schreibarbeit ist.


    Nun kommt ich zu dem Teil wo ich mir etwas unsicher bin wie die Engine das nun handhabt.


    Entweder wird Cast to wie ein include behandelt, oder eben halt, weil du in der Regel ja auf die Funktion, Event oder Variable zugreifst, die danach kommt, wie die :: Schreibweise.


    Zumindest habe ich das so gelesen, ob es jetzt 100 Prozent stimmt weiß ich nicht, ergibt aber Sinn.


    Und jetzt wo du weißt was dahinter steckt, müsstest du eigentlich auch ableiten können wie du es ungefähr zu benutzen hast.

  • Hier habe ich mal Cast erklärt, geht jedoch etwas tiefer in die technik zu dem was da passiert: RE: Variable in anderem Blueprint


    Wenn ich in dem Post von Pointern rede, dann geht es im eine Zeigervariable. Dies ist einfach eine Variable, welche eine Addresse im Speicher enthält und diese kann man nutzen um auf Objekte im Speicher zu zeigen und auf diese zuzugreifen. Jede Blueprint Variable, die von Typ Object oder Actor abstammt ist ein Zeiger auf entsprechendes Objekt/Actor.

    Dadruch dass eine Addresse kaum aussagt was da eigentlich drin steckt muss das Programm also dein Blueprint auch wissen, was sich hinter dieser Addresse verbirgt. Über Cast kannst du einen neuen Zeiger erzeugen, welcher auf die gleiche Addresse zeigt, jedoch einen anderen Typ vorgibt, der Cast funktioniert, wenn das ganze sinn ergibt und schlägt fehlt, wenn der Speicherinhalt nicht mit dem neuen Typ zusammenhängt.

  • In das "Object" muss eine Referenz von dem sein, wo ich hin Casten möchte.

    Richtig ^^


    Nun wieder zu meiner Frage... Ich habe keine Referenz für meine Physics die ich da in diesen blöden Input bekommen könnte^^

    Mach ne Overlap-Box (Box-Collision) auf deine Ladefläche, nimm ein "GetOverlappingActors", das Array in ein "ForEachLoop" rein und deaktiviere die Physics.


  • #include <std> stelle ich mir vor wie ein get einer gewissen Bibliothek. Somit habe ich quasi die Möglichkeit Variablen aus anderen stellen in meine aktuelle einzubinden. Das ergibt für mich soweit Sinn, nur brauchst du in C++ keine Referenc oder ähnliches um eben #include zu verwenden oder?

    Ich habe sehr lange nicht mehr mit C++ gearbeitet, aber so kenn ich es noch.

  • Mach ne Overlap-Box (Box-Collision) auf deine Ladefläche, nimm ein "GetOverlappingActors", das Array in ein "ForEachLoop" rein und deaktiviere die Physics.

    funktioniert leider nicht so einfach. Meine Objekte liegen dauerhaft in dieser Box. Im glücklichen fall das die Box noch an der Bordwand meines Fahrzeugs Liegt (In der Seitenlage) könnte ich das jeweilige Item eben noch behalten durch meine Reset Funktion. Nur kann ich keine TriggerBox Triggern in dem ein Objekt nicht raus/rein geht.

    Hoffe man versteht mein Gewirre.

  • Ich bin einfach zu bläd :D


    Habe nun eine Reference erichten wollen damit eben mein Cast bescheid weiß auf was er Zeigen soll (So habe ich es verstanden) nun also habe ich meine Reference im BP erstellt zu dem ich hin möchte




    Anschließend gebe ich dem Cast die Ref als Object Input



    Irgendwie kapiere ich das wohl noch nicht richtig

    • Hilfreich

    funktioniert leider nicht so einfach. Meine Objekte liegen dauerhaft in dieser Box.

    Na was meinst denn wohl wieso ich das sage?

    Ich hab nicht gesagt, du sollst ein "BeginOverlap"-Event benutzen, denn das wäre das falsche, denn wie du sagst, es liegt ja schon in der Box ^^


    Wenn du jedoch ein "GetOverlappingActors" nimmst, dann guckt es, welche Items mit der Box zum derzeitigen Zeitpunkt überlappen, was genau das sein sollte, was du willst...



    Wobei das mit Physics deaktivieren auch nicht klappen wird, denn dann bleiben die Items genau da hängen wo sie sich grad befinden...

    Da müsstest dann schon eher die Items an deinen Laster attachen oder nach dem Reset, wieder auf die Ladefläche teleportieren ^^

  • Hallo,

    ja ich habe es auch nicht richtig verstanden.

    Aber beim ersten Bild fehlt die Objektklasse. Das kommt da drauf an was du im Blueprint als Parent Class hast. Meist ja Get Player Pawn, oder Get Player Character oder je nachdem.


    Im zweiten Bild brauchst du das Cast to eigentlich ja nicht mehr da du das ja aus der Referenz nimmst die ja weis das es aus dem entsprechendem Blueprint kommt. Deshalb steht da ja Note. Weiter unten wird dir ja gesagt was der Fehler(Hinweis bedeutet).


    Aber wie gesagt bin halt Anfänger.

    Gruß

  • Hallo,


    CastTo ist Downcast von einer Basisklasse/Interface zur einer Implementation, eben dieser Basisklasse/Interface. Das kann z.B. die eigene Implementation von Player Character oder sonst eine Basisklasse sein. Desweiteren kann der CastTo Fehlschlagen, weil die Basisklasse/Interface die Implemenation nicht kennt.

    Umgekehrt gibt es den Upcast, der kein CastTo benötigt, da Upcasts immer erfolgreich sind. Beim Upcast wird die Implementation zur entrechenden Basisklasse/Interface gecastet. Erfolgreich sind Upcast deshalb weil die Implementation die Basisklasse/Implementation vollständig kennt.


    Im Allgemeinen sollte man schon ein Grundverständnis für OOP, Vererbung, Interfaces, abstrakte Klassen und Klassen haben, damit man besseres verständnis für das Casten hat. Eventuell bietet sich dafür ein Wiki oder Tutorial Artikel an damit das nicht so schnell untergeht.


    Grüße