ActorBP in anderem Blueprint an Socket anbinden

  • Hallo und einen schönen Abend, ich habe da ein kleines Problem,


    ich versuche mithilfe eines Structure ein Bp in einem anderen Bp aufzurufen und diese an Sockets im zweiten Bp anzubinden. Als Test habe ich ein Socket im Static Mesh des zweitem Bp eingebaut.

    Im Structure versuchte ich das Aufrufen des ersten BP als Variable (Actor, Static Mesh Actor, etc...) einzufügen, jedoch schlug dabei jeder Versuch fehl, da ich leider nicht genau weiß als welche Variable ich denn meinen ersten Blueprint deklarieren soll.

    In zweitem Blueprint habe ich an den event Begin Play ein Attach Actor to Component mit einem Get(Variable Structure/ Break Struc) an Target und das Static Mesh des zweiten BP mit dem Socket an Parent verknüpft.

    Nun weiß ich eben nicht, wie ich mein MasterBP im Structure deklarieren soll damit ich es im zweiten BP an den Socket binden kann.

    Vielleicht könnt ihr mir ja dabei helfen.

    Ich wünsche euch einen schönen Abend und viel Erfolg,

    Ciao Marc

  • Ich habe wieder ein kleines Problemchen und hoffe ihr könnt mich aufklären. Gestern hat es noch funktioniert, heute nicht mehr. Ich versuchte nun Pflanzen auf meinem Feld zu attachen, er sagt mir aber immer: Variable is not in scope.

    Denke, dass Problem liegt im Break Struc, da ab da er keine Daten im debug modus mehr hat und ab diesem Zeitpunkt er mir bei jedem Value eben sagt: Value not in scope.

    Hier ein kleines Bildchen. Vielleicht könnt ihr mich aufklären. Würde nur zu gerne wissen, was da los ist. Danke für euer Interesse und alles Gute.


    Ciao Marc

    • Offizieller Beitrag

    In einer Funktion ist eine Variable ist ab diesem Zeitpunkt gültig ab dem sie gesetzt wurde und maximal nur solange wie die Funktion ausgeführt wird.


    Funktion bedeutet: Du drückst auf einen Knopf, die Funktion wird ausgeführt, die Variablen werden gelesen und die Funktion arbeitet bis zum Schluss. Dann ist die Funktion abgeschlossen.


    Du kannst nicht während die Funktion arbeitet, die Variable von außen ändern.


    Das wäre wie wenn du beim Hausbau den Keller errichtest und während der Bau läuft die Pläne veränderst. Du müsstest dann nochmal von vorne beginnen.


    Ich denke das wird das Problem sein aber vielleicht kann das jemand anderst besser erklären.

  • Jetzt zeigt er mir nicht einmal mehr die Werte an.

    Habe die Variable aus der Funktion herausgenommen und im Constructtab vor der Funktion eingefügt.

    Er zeigt mir zwar nicht an, dass die Variable not in scope ist, aber er ezigt er auch so gar nichts mehr an. Und das attachen vom actor an das Blueprint funktioniert auch nicht mehr.

    Vielleicht könnt ihr mich ja aufklären was ich falsch gemacht habe. Jede Hilfe wäre gerne gesehen. #

    Danke für das Interesse und eure Zeit


    Habt einen schönen Tag und alles Gute, ciao

    • Offizieller Beitrag

    Kann es sein das die Variable leer ist zu dem Zeitpunkt wo die Funktion ausgeführt wird ?


    Geb der Varaible doch einfach mal einen deafult wert und prüfe ob sie dann ausgeführt wird.


    Ich Prinzip soll die Funktion erst ausgeführt werden wenn etwas in der Variable drin steht. Ist die Variable leer, muss auch nichts berechnet werden.

    Dies mit einem Branch abfragen. Ist die Variable da , dann ist sie True ist sie nicht da dann False. Wenn True, dann die Funktion ausführen und wenn false die Funktion nicht ausführen.

  • In dem Default wert der Variablen ist eigentlich ein Actor platziert. Der Master des Plantactors. Ist aber auch egal welchen Wert ich einfüge, da er mir keinen Actor im Editor anzeigt.


    Gestern hat er mir noch Actors angezeigt. Habe aber im Struct die Class reference ausgetauscht und seitdem funktioniert es nicht mehr.


    Naja, aber danke für den Tipp. Wäre nicht das erste Mal, wenn es an solch einem Fehler liegen würde.


    Danke, ciao

  • Das ist der süße kleine Blueprint mit dem ich kämpfe. Bin nun soweit, dass ich aufgebe den Actor in einer Funktion aufzurufen. Im englischen Forum steht nämlich, dass ich, wenn ich die Anmerkung "Variable is not in scope" bekomme, dies über ein Funktion lösen kann. Hab ich aber nicht hinbekommen. Stattdessen bekam ich eben in der Funktion diese Meldung. Nun weiß ich aber schon, dass falls ich diesen Blueprint in der Welt platziere und dort in den Default Settings den Actor ändere, Unreal mir auch die Variable in PLant Struc ändert. Dies sollte aber nicht der Fall sein, da ich ja eigentlich hier im Blueprint nur die Möglichkeit geben möchte einen Actor an einen Socket dieses Blueprints zu attachen, da ich das Blueprint ja öfters in der Welt platzieren möchte und mit immer anderen Actors attachen.

    Was mich aber am meisten verwundert ist, dass es schon eimmal funktioniert hat, und nun da ich im Struct die Classreference geändert habe, dies nicht mehr funktioniert.

    Ich verstehe echt nurmehr Bahnhof.

    Vielleicht könnt ihr mir ja helfen. Wäre echt super und würde mich einen ordentlichen Schritt weiterbringen. Falls nicht, ich werde weiter herumprobieren, nur ob ich es schaffe ist fraglich.


    Danke auf jeden Fall für eure Zeit. Ich hoffe ihr habt mehr Erfolg mit euren Projekten.


    Danke und noch einen schöne Woche, euer MacArmand

    • Offizieller Beitrag

    GetActorOfClass ist nach meiner Meinung die sinnloeseste Funktion aller Zeiten. Diese Funktion sucht im Level alle arten von Actors die von der Class, die als Eingang gesetzt wurde, gefiltert wird. Das bedeutet, wenn im Level ein Actor steht und die heißt Blume und GetActorOfClass wird im Level Blueprint ausgeführt und die Funktion hat den Eingang Blume. Dann werden alle Actors gesucht die den Namen Blume hat. Der Class Eingang ist nur sowas wie ein Suchfeld, wonach es suchen soll. Die Blume wurde nun gefunden und wird als Blume Actor als variable ausgegeben. Jetzt kommt das sinnlose an dieser Funktion. Sind 3 Blumen als actor in der welt, dann sucht die Funktion nach alle Actors die den Namen Blume haben und gibt irgend eine Blume als variable aus. Man weis jetzt also nicht, welche Blume er gewählt hat.

    GetAllActorsOfClass sucht auch nach alle Actors die als Class eingestellt sind und geben alle gefundene Actors als Array aus. Damit kann man also speziel eine Blume ansprechen.


    Eine Class Datei zu nutzen um dieses Actor in der Welt anzusprechen funktioniert nicht. Class Dateien sind eher Rohe daten die in der Welt nicht sind. Sie werden eher nur gelesen und als Actor in der Welt platziert. Class sind alle in deinem Content.


    Wenn du eine Variable erstellst, zb Actor als Class Referenz. Dann bemerkt du, dass man die Class auswählen kann für die Variable. Solltest du eine Variable als Actor Objekt erstellen, dann kann man kein Wert für die Variable einstellen. Mit einer Actor Class variable kann man nur sachen verwenden, wie actor spawnen, oder nach actors suchen. Wenn du einen Actor Objekt hast, dann kann der direkt mit dem Actor verlinkt werden. Das geht aber nur, wenn einer dieses Actor gefunden hat, und in den Actor Objekt gesetzt hat. Erst dann ist diese Variable gefüllt und hat ein direkten Bezug zum Actor, die man immer ansprechen möchte. zB führe dies und das aus.


    Dein BP macht praktisch nichts anderes, suche nach diesem Actor und gebe irgend ein actor, falls mehrere vorhanden sind, als variable aus. Hier schaut es so aus, als wurde kein Actor gefunden. Also ist der ausgabe wert vom GetActorOfClass NULL. Somit ist nichts vorhanden. Ist nur ne Vermutung, Value Not in Scope hatte ich bestimmt auch mal als Fehlermeldung, aber kann sie jetzt zu nichts zuordnen. Wenn der Wert NULL ist, wird eher ein Error kommen das der Wert NULL ist. Jede Funktion reagiert aber unterschiedlich, wenn ein Wert NULL ist.

  • Danke Dj EKI für diese sehr umfassende Erklärung. Hab es mir ein paar Mal durchlesen müssen, aber ich glaube ich verstehe es nun halbwegs.

    Sinn meines Blueprints sollte es sein, dass eben kein Objekt von der Welt gefunden wird und an den Socket platziert wird, sondern eben aus dem Content. Es sollte nämlich im Endeffekt möglich sein, dass wenn der Spieler das entsprechende Objekt( in diesem Fall Samen) zur Verfügung hat, damit auf dem Feld Pflanzen zu ziehen. Da jede Pflanze auch andere Eigenschaften dann mit sich bringt, hätte ich diese gerne eben als Blueprint, anstelle von Static Meshes.

    Nun weiß ich aber, warum es mit der ersten Class funktioniert hat und mit der zweiten Class nicht, denn die Actors der ersten Class, waren schon im Level platziert, während die Actors der zweiten Class eben nicht.


    Ich hätte da nur noch eine Frage. Wie funktioniert dass dann mit Levelstreaming. Müsste ich in jedem Level alle Arten von Blumen platzieren, damit ich in diesem Level auf dem Feld dann auch alle Arten von Blumen platzieren kann, bzw. kann ich dann nur Blumen auf dem Feld platzieren, die eben in diesem Level auch vorhanden sind, oder kann ich auch Blumen aus Level 1 in Level 10 platzieren?


    Danke, danke auf jeden Fall für die Erklärung. Du hast mir sehr geholfen. War schon ein wenig am verzweifeln, warum es nicht klappen mag. Mit den ganzen Hintergrundabläufen der Engine kenne ich mich überhaupt nicht aus, von programmieren gar nicht zu sprechen. Aber zum Glück gibt es dieses Forum und ich lerne nie aus. Großes Dankeschön an dich und alle die daran mitwirken.


    Schönen Morgen und einen erfolgreichen Tag, wünscht euch euer Marc

    • Offizieller Beitrag

    Es gibt viele Wege, wie du deine Pflanzen setzen kannst, man müsste nur den Werdegang kennen, wie es im Spiel funktionieren soll. Ich kann dir paar grundlegende möglichkeiten geben. Ich gehe einfach mal davon aus, das eine Planze ausgewählt wird und gepflanzt wird.


    1. Es gäbe die einfachste Möglichkeit für jede Pflanze ein BP zu erstellen. Die Pflanze die ausgewählt wird, wird dann gespawnt, wenn man eine Fläche markiert hat mit LineTrace oder so. Wenn jede Pflanze ein komplizierten Script hat, dann erstelle einen sogenannten Master Pflanze BP und mach daraus Child BP. https://docs.unrealengine.com/…s_Advanced/2_5/index.html Das MasterBP benötigt dann ein static Mesh Component und den kompletten Script von dir, und alle Childs können einen Static Mesh in Static Mesh Component zugewiesen bekommen mit ein paar bestimmte Werte in Variablen die für die Pflanze wichtig sind. Somit ist der gesammte Teil des Scripts im MasterBP und das aussehen und die Daten sind im Child. Child wird dann gespawnt, und da sie vom Master erben, wird der Script ausgeführt.


    2. Möglichkeit, du benutzt eine DataTable. Dann brauchst du nur ein BP Actor und mit dem DataTable Row Name sagst du, welche Pflanze gesetzt werden soll und da eine DataTable aus Struct besteht, kannst du gleichzeitig die Daten dazu entnehmen, die für die Pflanzen benötigt werden. Hier wird wieder eine static Mesh Component benötigt, die aber leer ist. Für die Datatable benötigtst du eine Struct, da wird eine Variable erstellt StaticMesh als Object Referenz. Die ist wichtig und dann kannst du weitere Variablen erstellen die wichtig sind, zb Wachszeit usw.. In der Struct kannst du standard Werte einstellen, aber unnötig, weil alles wird in der Datatable eingestellt. Im BP muss nur noch dein Static Mesh Component mit einer StaticMesh gefüttert werden. Die Variable StaticMeshComponent bekommst du, wenn du von der Componentliste diese in den BP ziehst.

    Externer Inhalt www.youtube.com
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklären Sie sich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.

  • Danke für die Tipps. werde ich sicher einmal reinschauen. Hab das Problemchen nun anders gelöst und bin von den Sockets endgültig weggekommen. Versuche nun mithilfe eines arrays das Feld aufzubauen, aber er pflanzt mir nur drei anstelle von 625 Pflänzchen an. Hier das Blueprint dazu. Vielleicht könnt ihr mir weiterhelfen.

    Funktioniert aber ansonsten echt klasse und dass ich dass hin bekommen habe finde ich schon voll krass. ICh wünsche euch allen einen wunderschönen Abend und mein PC kriegt einen dicken fetten Schmatz.


    Alles Gute und viel Erfolg euch allen

    • Offizieller Beitrag

    Das ist ja total unlogisch ^^

    Schau dir bitte den Array Bereich an wie sie funktionieren. https://docs.unrealengine.com/…kingWithArrays/index.html


    Der Name Remove Index sagt ja schon der Name, dass ein Index entfernt wird. Du hast 3 elemente mit ein MakeArray erstellt, somit hat dein Array nur 0-2 Index. Last Index ist dann 2. Ist also kleiner als 625. Komischerweise konvertierst du den Bool zu Int. Somit ist Int 1. RemoveIndex nimmt das Element 1 weg und wird somit nur 2 mal in der loop abgespielt. 3 insgesammt wegen dem ersten spawn.

  • Ich grinse über beide Backen. Hab es so halb geschafft. Zwar kann man immer nur eine Reihe von 25 Pflanzen auf dem Feld ernten und nicht jede Pflanze extra, aber bei 625 Pflänzchen pro Feld ist das zu verkraften. Auch das Ernten ist noch nicht implementiert, aber Unreal baut mir ein Feld mit 625 Pflanzen derselben Art auf und wenn ich mehrere Pflanzenactors habe kann ich mir daraus die richtigen auswählen. Danke Butter Fly Games und Dj Eki für die Hilfe. Hätte es ohne den Denkanstoß vermutlich nie hinbekommen. Hihihi, nun kommen die kleineren und mittleren Felder an die Reihe und dafür muss ich nur kopieren. Die Logik ist begriffen. Danke Danke Danke,


    Schönen Abend euch allen und viel Erfolg,

    Ciao euer Marc

  • Soweit so gut- Scheint alles recht gut zu funktionieren. Die Pflanzen werden auf jedem Feld gespawnt. Zwar ruckelt es schon ein wenig bei der Anzahl an Pflänzchen bei mehreren Feldern, aber das kann man sicher irgendwie beheben. Ich hätte nur eine andere Frage. Nach dem Play im Editor habe ich diese Fehlermeldungen erhalten. INsgesamt über 60.000 mal. Vielleicht könnt ihr mir sagen, was unreal damit genau meint, denn ich kenne mich nicht aus. Habe an dem Foreachloop nichts geändert, wüsste nicht einmal wie ich in das Menü komme, daran was zu ändern. Jeder Tipp wäre hilfreich. Hier ein Bild zur Fehlermeldung:

    Danke fürs Durchlesen, einen netten Abend und guten Wochenstart, ciao euer Marc

  • Habe an dem Foreachloop nichts geändert, wüsste nicht einmal wie ich in das Menü komme, daran was zu ändern.

    Doppelklick auf das Makro ^^



    Steht da nicht noch mehr drin?

    Wie sieht das BP aus, das den Fehler hervorruft? (Screenshot)


    Ich würde das im übrigen per "ForLoop" lösen, bei ForEachLoop ist das Problem, dass wenn du da ein Array automatisch erstellen lässt, es ins unendliche laufen kann und dann bricht es früher oder später ab, während du bei ForLoop, nen Maximal-Wert vergeben kannst, bis zu dem es geht und nicht weiter.


    60k Einträge mit je 6 gleichen Meldungen, sind 10k Durchläufe, das ist viel zu viel für die 625 die es eigentlich nur laufen dürfte und könnte schon allein das Problem verursachen...


    Hast du deine Variablen in der Function gesetzt oder werden die weiterhin immer neu generiert?

    Du brauchst die Variablen in ner Function nicht alle fürs ganze BP nutzen, viele kannst auch einfach Local abspeichern ^^


    Das Return kannst evtl. umgehen, indem du in der Function, eine immer vorhande Variable setzt (nicht local), local ist nur solange verfügbar, wie die Variable aufgerufen wird, während eine Variable die fürs ganze BP gilt, immer vorhanden ist...



    Ansonsten heißts viel testen, so mach ich das auch wenn ich Probleme hab, wenn du ne Local-Variable per "Watch-Value" in der Function nicht auslesen kannst, könnte es auch helfen, die Local noch auf ne feste Variable zu setzen, brauchst ja nur zum testen und danach kannst sie wieder löschen.

    Dann gehst in dein EventGraph und machst dort ein Event-Tick, wo du die feste Variable ausliest ^^

  • Bitte nicht lachen ^^

    Ich versuchte mein Bestes, kenne mich ja mit programmieren nicht aus und bin erst ganz am Anfang. Bin mir sicher, dass kann man besser und einfacher machen, aber so hat es funktioniert, naja bis auf die Fehlermeldungen:)

    schönen Abend und danke für die Tipps, auch wenn ich nicht einmal die Hälfte davon verstehe, ich werde schon lernen, ciao und alles Gute

  • Keine Ahnung was du da machst.


    Üblich wäre es das Feld als 2-dimensionales Array anzulegen und dann Reihe für Reihe die Pflanzen mit einem Offset zu spawnen.

    Da es in Blueprints nicht möglich ist 2-dimensionale Arrays anzulegen, hier mal ein Beispiel mit einem Array das das ganze Feld enthält und mit dem Modulo-Operator werden die einzelnen Reihen/Spalten errechnet.


  • Dachte mir schon, dass ich da was umständlich gemacht habe. Die pflanzen hat er mir ja gespawnt, nur die Fehlermeldungen waren nervig. Ich werde das Blueprint nachbauen wenn ich darf und testen. Danke DarkFaces.

    Schönen Tag noch und alles Gute,

    Achja, vielleicht hat man es schon bemerkt aber ich bin kein Programmierer :)


    Danke Danke,