Kleine Erklärungsfrage "Cast" in C++

  • Hallo Freunde des Codens. Bin rel. neu in C++.


    Kann mir einer genau erklären wofür "Cast" gut ist in C++, anhand diesen Beispiels vllt oder auch generell?


    Bin in einem Actor "Waffe".


    APawn* OwnerPawn = Cast<APawn>(GetOwner());

    AController* OwnerController = OwnerPawn->GetController();

    FVector Location;

    FRotator Rotation;

    OwnerController->GetPlayerViewPoint(Location, Rotation);

  • Keinen Plan von C++ aber ich denke mal es ist genau wie in BP. Cast nutzt du um eine Funktion in einem anderen Kontext (Anderes Objekt) zu nutzen. Sprich du wählst exakt die richtige Instanz des anderen Objektes aus um dort eine Funktion zu nutzen. Du bist jetzt im "script" (oder wie auch immer man das in C++ nennt) der Waffe und brauchst aber ne Funktion aus dem Controller des Pawn.

  • Keine Ahnung, kenne mich mit C++ nicht aus, habs früher mal versucht, aber war mir dann zu blöd...


    Außerdem ist das Visual-Scripting doch eh viel cooler und übersichtlicher, hab von nem Freund mal gehört, dass er früher mit C++ Spiele entwickelt hat und wenns nen Bug gab, musste man erstmal den ganzen Text durchsuchen, während man mit Visual Scripting, sich direkt das Problem angucken kann^^

  • jo, versteh dich, hab selber 3 Jahre lang nur mit Blueprints gebastelt, bis ich zu einem Punkt kam, wo es nicht mehr weiterging.


    Das hat mich dann sehr geärgert.

    Soviel Zeit und Mühe reingesteckt und mit Blueprints stößt man rel. schnell an Grenzen.

    Mir war dann klar, wenn ich wirklich auf lange Sicht irgendwann mal ein Spiel verwirklichen will, das leistungsoptimiert und möglichst viel Kreativität zulässt, dann komm ich um C++ nicht herum.

    Ich kann mir schwer vorstellen, dass all die Spiele, die wir gern auch zocken, mit BP zu erstellen wären.


    Soweit ich weiß bedienen sich die Profis alle C++, nicht von ungefähr.

  • Keinen Plan von C++ aber ich denke mal es ist genau wie in BP. Cast nutzt du um eine Funktion in einem anderen Kontext (Anderes Objekt) zu nutzen. Sprich du wählst exakt die richtige Instanz des anderen Objektes aus um dort eine Funktion zu nutzen. Du bist jetzt im "script" (oder wie auch immer man das in C++ nennt) der Waffe und brauchst aber ne Funktion aus dem Controller des Pawn.

    Sorry da muss ich dich korrigieren. Das stimmt weder in BP noch in C++ (noch in irgend einer anderen Programmiersprache)


    Um Casten zu Verstehen muss man erstmal wissen was Vererbung ist.


    Hier ein kleines Beispiel:

    Angenommen du hast die Klasse Fahrzeug mit den Funktionen:

    - Fahren()

    - Bremsen()

    Nun möchtest du eine Klasse "Auto" erstellen. Ein "Auto ist grundlegend ein Fahrzeug, also erbst du von der Klasse "Fahrzeug". Nun hat die Klasse die Funktionen Fahren() und Bremsen() ebenfalls. Du möchtest jetzt noch eine Zusätzliche Funktion Schalten() implementieren.

    Deine Klasse "Auto" hat jetzt also folgende Funktionen:

    - Fahren() --> geerbt

    - Bremsen() --> geerbt

    - Schalten()


    Wenn du nun mit new Auto() ein Objekt von Typ Auto erstellst hat dies alle 3 Funktionen.

    Du kannst jetzt dein "Auto" in einer Variable "Fahrzeug" speichern.

    Warum geht das?

    Ganz einfach, weil dein Auto ein Fahrzeug ist. Das Problem hierbei ist, dass dein Auto Objekt so gesehen vergisst, dass es ein Auto ist. Es weiß jetzt nur noch, dass es ein Fahrzeug ist. (und kann auch nur auf die Funktionen von "Fahrzeug" zugreifen)


    Möchtest du nun wieder auf die Funktionen von "Auto" zugreifen muss du dein Fahrzeug zu zu einem Auto "Casten".

    Würdest du eine versuchen eine andere Klasse (zb "Pawn") zu einem Fahrzeug zu casten, dann würde der Cast fehlschlagen.


    In kurz kannst du es dir so merken:

    Du nimmst dein Fahrzeug Objekt und fragst es:

    Bist du ein Auto?


    Nun ein praktisches kleines Beispiel. Vielleicht kennst du das Event: On Actor Begin Overlap

    Da kriegst du den anderen überlappenden Actor als "Other Actor" übergeben.

    Wenn du nun wissen möchtest ob dieser Actor zum Beispiel ein "Character" ist, dann kannst du den Parameter "Other Actor" zu einem "Character" casten. Ist der andere Actor ein Character, dann kannst du auf die Character Funktionen zugreifen, wenn nicht schlägt der Cast fehl.


    Ich hoffe das war einigermaßen Verständlich.


    Gruss Veelos

  • Das mit dem Cast stimmt so^^


    Aber ich muss dir leider dort widersprechen:

    Das Problem hierbei ist, dass dein Auto Objekt so gesehen vergisst, dass es ein Auto ist. Es weiß jetzt nur noch, dass es ein Fahrzeug ist. (und kann auch nur auf die Funktionen von "Fahrzeug" zugreifen)

    Nicht dass jetzt einer das vererben falsch versteht...


    Du kannst aus einem Actor ein Child erstellen und diesem alles ohne Ausnahme vererben, dieser Child vergisst auch nicht, dass er mal ein Actor war und kann weiterhin auf die Funktionen seines Parent zugreifen^^


    Actor (Parent):


    Child:



    Variablen kannst übrigens auch vom Parent holen, einfach rechtsklicken und eingeben, oder so damit sie in der Liste aufgeführt werden:



    Wenn man den Child aus einem Overlap-Event oder sonst so als Variable holt, muss man casten, nicht wenn man nur den Child benutzt, um damit rum zu fahren^^

  • Du kannst aus einem Actor ein Child erstellen und diesem alles ohne Ausnahme vererben, dieser Child vergisst auch nicht, dass er mal ein Actor war und kann weiterhin auf die Funktionen seines Parent zugreifen^^

    Ich glaube das würde auch niemand bestreiten.

    Die Parent Klasse kennt aber nicht die Sachen von der Child Klasse, da Vererbung nur in eine Richtung funktioniert. Parent -> Child umgekehrt wird nicht vererbt. Und genau das hat auch Veelos so geschrieben.


    Private Members werden meines wissens nach auch nicht vererbt, nur public und protected werden vererbt



  • Sehr gut erklärt, man lernt nie aus.


    Intuitiv habe ich aber Cast schon oft so genutzt wie du erklärt hast - wobei ich jetzt vereinfacht gesagt hätte daß du einfach immer gegen eine "passende" Klasse - castest. Du kannst aber auch gegen die eigene Klasse (nicht child oder parent) casten. Sprich du castest ein Fahrzeug gegen Fahrzeug. Klingt erst mal doof aber ich versuch mal zu erklären was du meinst.


    Ich nutze Cast oft in ForEachLoops.


    Beispiel - ich habe eine schöne Deckenleuchte gemacht, die kommt mit all ihren Funktionen wie Flackern, Dimmen, Farbwechsel etc in einem schicken Blueprint namen "BPCeilingLamp". 20 mal kopiert weil man braucht ja ne Menge Deckenlampen. Aber alle Kopien sind auch vom Typ "BPCeilingLamp", also meines verständnis nach selbe Klasse, kein Child.


    Ich kann jetzt aus einem anderen Kontext (z.B. Fernbedienung BP) zu allen Deckenlampen Casten und alle auf einmal ausschalten.


    Sprich ich mach einfach:


    GetAllActorsOfClass(BPCeilingLamp)-->ForEachLoop-->CastTo(BPCeilingLamp)-->TurnOff




    Auf dein Beispiel übertragen habe ich alles von der Klasse Fahrzeug bekommen und auf Fahrzeug gecastet würde ich sagen.


    Oder mache ich das "dumm" - gibt es einen besseren oder logischeren Weg?


  • Ein Cast macht nur dann Sinn, wenn du nicht weisst, was für eine Klasse du zurück kriegst. Bei GetAllActorsOfClass(BPCeilingLamp) weisst du ja, dass du nur CeilingLamp's findest. Die bessere alternative wäre hier, den cast einfach weg zu lassen.


    Würdest du hingegen GetAllActorsOfClass(Actor) machen und in dieser Liste nur nach CeilingLamp's suchen, dann könntest du nach CeilingLamp casten. (Macht aber in deinem Beispiel Null Sinn).


    Konnte ich damit deine Frage beantworten?


    Gruss Veelos

  • Die bessere alternative wäre hier, den cast einfach weg zu lassen.

    Da kriegt man doch sowieso ne blaue Meldung am Cast angezeigt, dass man es nicht braucht^^


    GetAllActorsOfClass(BPCeilingLamp)-->ForEachLoop-->CastTo(BPCeilingLamp)-->TurnOff

    Eigentlich bräuchte man dazu nicht einmal ein "ForEachLoop" oder "GetAllActorsOfClass", wenn man das ganze über ne LightFunction macht, mit ner MaterialParameterCollection:


    Leider funktioniert es nicht in ner Light-Function, die Farbe des Lichts zu ändern, Light-Function macht nur schwarz/weiß^^

    Farbig soll im UDK aber noch funktioniert haben, wobei die UE4, ne komplette Neuentwicklung ist, wenn ichs noch richtig weiß...

  • Ja stimmt, ich habs grad noch mal angesehen und da ist echt ein Hinweis daß man den Cast weglassen kann. Mann bin ich dumm. Aber schön wenn man auch in meinem Alter noch was dazulernen kann ^^


    Farbe ändern geht übrigens mit "Set Light Color". Ich hab in dem BP aber auch ein Point light - also eine "point light Component". Denke mal müsste aber auch mit anderen lights gehen.