Visibilty

  • Moin Zusammen,


    ich bin neu im Forum angekommen und habe da gleich mal eine Frage in der Hoffnung Ihr könnt mir weiterhelfen.

    Was das Programmieren angeht habe ich schon ein par kleine Spiele erstellt stoße aber nach 1 Jahr immer wieder auf Dinge wo ich einfach
    verzweifel obwohl es bestimmt ganz einfach ist.


    Mein neustes Problem ist, das ich die visiblity von mehreren Leichen welche ich als BP_Character erstellt und in verschiedenen Ecken eines Raumes verteilt habe.

    Mit BeginPlay -> habe ich Set Physics auf true sowie die visibility auf false gesetzt, doch ragdoll landen die Leichen immer anders, das funktioniert soweit super. Nehme ich nun ein Trigger Volume kann ich dann die einzelnen Leichen mit overlap auflisten und visible setzten, ist mir aber doch sehr umständlich alle einzeln anzuklicken usw. Ich würde gerne sobald ich einen Schlüssel aufnehme, die Leichen erscheinen lassen. Was dann aber einfach nicht geht. Warum ist das so? Ich habe es mit custom Events versucht, mit Varibale durch zugriff auf BP_Leiche und set visibilty, mit class settings, aber es kommt immer der selbe fehler


    Blueprint Runtime Error: "Accessed None trying to read property Leiche". Node: Set Visibility Graph: EventGraph Function: Execute Ubergraph BP Key Blueprint: BP_Key

    Blueprint Runtime Error: "Accessed None". Node: Set Visibility Graph: EventGraph Function: Execute Ubergraph BP Key Blueprint: BP_Key


    außer wie gesagt mit dem trigger volume, aber bei 30 leichen alle da reinziehen und über alle die mesh auf visilble setzten kann doch nicht die Lösung sein.


    Vielen Dank


    Gruß

    Der Frittenstecher

  • Sleepy

    Hat das Thema freigeschaltet.
  • Wenn ich dich richtig verstanden habe, willst du, dass ein BP in einem anderen BP ein Event auslöst. In deinem Fall ein Event, welches die Leichen dann auf Visible stellt.

    Da gibt es zwei Möglichkeiten. Das eine ist schon fast zu meiner Standardantwort geworden, löse es über Interfaces. Du kannst ein Interface in einen Actor einbauen und die Interfacefunktion dann als Event einbinden. Von einem anderen Actor aus kannst du dann dieses Event auslösen.

    Eine weitere Möglichkeit ist die Lösung über Event Dispatcher. Eigentlich ist das sehr ähnlich in der Handhabung, wie bei Interfaces. Den Eventdispatcher legst du im Actor der Leichen an und rufst den per Referenz zum Actor dann von dem anderen BP auf, wenn es halt notwendig ist.

    Also in beiden Fällen brauchst du ein Binding in Form einer Referenz zum entsprechenden Actor.

    P.S. eine dritte Möglichkeit, von der ich mir aber nicht so ganz sicher bin, ob die so funktioniert, wäre eine Actor-Component. Eine Actor-Component kannst du ebenfalls in entsprechenden Actor einbauen, in deinem Fall in die Leichen. Du kannst in die Component dann auch entsprechende Funktionen einbauen, die du global von anderen BPs aufrufen kannst.

    • Offizieller Beitrag

    Schwer zu sagen wo dein Problem liegt es sind sehr wenig Informationen um zu wissen was dein Problem ist.


    1. Ich kann mir vorstellen, dass deine Referenzen nicht richtig initialisiert sind. Das könnte zb passieren wenn deine Leichen verteilt werden aber zu diesem Zeitpunkt die Variable noch nicht gefüllt ist. Eine Variable sollte auch immer richtig deklariert sein. zb ein Integer oder ein Text sein. Ist eine Variable leer, dann ist sie nicht automatisch 0 sondern sie hat keinen Inhalt. Versuchst du keinen Inhalt zu multiplizieren gibt es einen Fehler. Setzt du die Variable bei Levelstart hingegen auf 0, dann gibt es keinen Fehler.


    2.Dein Script im GameMode oder LevelBlueprint. Ausführen. Auf den GameMode oder auch das LevelBlueprint kannst du immer zugreifen wenn das Spiel läuft und nicht nur wenn das Blueprint ausgeführt wird.

    3.Du hast ein Logikfehler im Blueprint ohne das Blueprint zu sehen wird es schwierig dir zu helfen.

  • Vielen Dank für eure Antworten,


    ich habe nun nochmal 2 screenshots gemacht, einmal vom eventGraph der Leiche und einmal von dem des Schlüssels.


    Vielleicht ist es so etwas verständlicher :)

  • Blueprint Runtime Error: "Accessed None trying to read property Leiche".

    Also, der Fehler passiert definitiv, wenn du irgendeine Variable abfragst, und diese noch keinen Wert hat. Ist manchmal etwas tricky, den Fehler zu vermeiden. Meistens kannst du der Variablen einen Defaultvalue übergeben. Eine andere Möglichkeit ist mit ?IsValidate (wichtig ist das is Validate mit dem Fragezeichen) vorher abzufragen, ob die Variable auch gültig ist.


    außer wie gesagt mit dem trigger volume, aber bei 30 leichen alle da reinziehen und über alle die mesh auf visilble setzten kann doch nicht die Lösung sein.

    Ich würde es mit einem Array versuchen, in dem dann alle Leichen gelistet sind und per Loop dann auf Visible stellen.

    • Offizieller Beitrag

    Du hast zwei Blueprints


    1. BP_Leiche

    2. BP_Key


    Du startest dein Spiel und führst beide Blueprints aus ?

    Sind die Variablen zu der Zeit schon gefüllt ?


    Du kannst dir ja mit einem Printstring den Inhalt der Variablen anzeigen lassen, Vielleicht baust du testweise einfach mal ein paar Delays von ein paar Sekunden ein umzusehen was da passiert und wann die Variablen gefüllt sind.


    Ich vermute dass die Variablen zum Zeitpunkt des setzens bei Levelstart noch leer sind. Oder du überschreibst die Variable nachdem bereits ein Teil der Leichen gesetzt wurden. Dann wäre vermutlich die Referenz weg und es gäbe einen Fehler

  • Mich würde mal interessieren, wo du die Referenzen definierst, oder ist das alles, was in den BP drin steht. Ich bin im obigen Kommentar davon ausgegangen, dass du Construct jetzt einfach nicht mit auf dem Screenshot hast.

    Benutz doch mal die Seite https://blueprintue.com/ , um das gesamte BP anzuzeigen. Die Fernanalyse wird trotzdem noch schwer genug sein, weil es immer schwierig ist sich in fremde Projekte reinzuversetzen, aber dann haben wir wenigstens mal ein komplettes BP und das in lesbarer Größe.

  • Oh Gott :D ,


    Ich merke ich muss noch einiges lernen :(.

    Also bei dem was ich mir bisher so zusammen gebaut habe an Spielchen hat immer alles soweit funktioniert. Bin ich mal nicht weitergekommen gab es youtube ;). Nun habe ich grade das gefühl es war bisher alles falsch was ich da gemacht habe.


    Sleepy, was meinst du mit ist die variable leer oder gefüllt?


    Und

    Tomarr, wieso brauche ich cunstruct und welche Referenzen? Ich bin immer davon ausgegangen jeder BP_actor ist einer für sich und ich kann Events über cast_to bzw. über die die variable z.b. Leiche-> Bp_leiche in der BP_key zugreifen und dort Events auslösen wie mesh ändern oder Größe usw.


    Das ich nun einen Variablen füllen muss, einen cunstruct oder eine Referenz haben muss war mir null bewusst.

    Ich muss mich da nun echt nochmal tiefer belesen um da weiter zu kommen.


    Ich danke euch für diesen wachrüttler. Ist aber auch nicht ganz einfach wenn alle Youtube tutorials immer auf englisch sind und nur zack zack gehen. *dead*


    Vielen dank und beste Grüße.

    • Offizieller Beitrag

    was meinst du mit ist die variable leer oder gefüllt?

    Erstellst du eine neue Variable dann ist sie erstmal Leer und Undeklariert.


    Nehmen wir mal an du erstellst eine neue Variable namens "VarA", dann kannst als Default Wert eine 0 reinmachen.

    Sie ist nicht leer sondern hat den Wert 0


    Jetzt machst du noch eine Variable mit dem namen "VarB" und lässt sie einfach so ohne eine 0 als default Wert reinzumachen.

    Sie ist somit leer und sie ist auch nicht deklariert. Weil die Variable nicht weiß´dass sie eine Integer Variable ist.


    Addierst du nun VarA und VarB, wird das nicht funktionieren da VarB leer ist. Hätte VarB den default Wert 0 dann würde es gehen.


    Nehmen wir mal an du startest dein Level und setzt VarB auf 1 dann würdest du VarA und VarB addieren können da sich in beiden Variablen Zahlen befinden.


    Auch wenn VARA den Wert 0 hat, sie sie trotzdem undeklaiert. Weil du ihr nicht gesagt hast dass sie eine Integer ist.


    So jetzt machen wir mal einen Fehler:

    Wenn du VarA = 0 beinhaltet und VarB nichts dann kannst du in VarB auch hallo reinschreiben.

    Addierst du also VarA + VarB dann addierst du den Wert0 mit Hallo was natürlich nicht funktioniert. So kannst du einen Fehler verursachen in dem du in eine undeklarierte Variable ein mist reinspeicherst.


    Machen wirs besser:

    VarA bekommt den Default Wert = 0 und wird als Integer deklariert

    VarB bekommt eebenfalls den Wert 0 und wird ebenfalls als Integer deklaiert.

    0 + 0 lassen sich addieren und verursachen somit keinen Fehler.


    Nun kannst du die Variable "VarB" auch auch auf 5 setzen und "VarA" auf 10 ohne dass es einen Fehler gibt.


    Würdest du aber in VarA "hallo" reinschreiben, dann würde die Unreal sagen: "ne is nicht". Weil Unreal weiß das beides Integer sind.

    Das ist der Unterschied zu leeren nicht deklarierten Variablen und leeren deklarierten bzw vollen Variablen.


    Das ist übrigens in jeder Programmiersprache so. In einigen Sprachen müssen Variablen immer deklaiert sein und in anderen eben nicht.



    Nochmal zurück zu deinem Problem: Mein Gedanke war, du vielleicht bei Levelstart das Leichen Mesh in die Varaible speicherst. Dann wäre die Variable 0 voll mit einer Leiche. (Wie sich das anhört)

    Nur könnte ja schon dein Leichen Blueprint zu dieser Zeit versucht haben etwas aus den Variable auszulesen obwohl nichts drin ist.


    Verstehst was ich meine ?


  • wieso brauche ich cunstruct und welche Referenzen? Ich bin immer davon ausgegangen jeder BP_actor ist einer für sich und ich kann Events über cast_to bzw. über die die variable z.b. Leiche-> Bp_leiche in der BP_key zugreifen und dort Events auslösen wie mesh ändern oder Größe usw.

    Cast to ist eine Möglichkeit zwischen BPs zu kommunizieren. Allerdings kommt es auch immer ein wenig darauf an, was genau du machen willst. Es gibt da noch diverse andere Methoden, um die Kommunikation einzuleiten, Interfaces zum Beispiel, direkt die Actorklasse als Referenz nehmen, Cast To ist ja auch eine Form der Referenzierung, es gibt aber wie gesagt noch mehr. Ich glaube, man kann noch nicht einmal sagen, was davon dann genau richtig oder falsch ist, es gibt halt viele Wege in der Programmierung etwas umzusetzen. Einige funktionieren halt vielleicht ein wenig besser als andere und wieder andere kannst du vielleicht besser mit umgehen etc.

    Man müsste jetzt halt mal ein wenig analysieren, wie du das in deinem Projekt bisher umgesetzt hast, wie du was aufgebaut hast und dann mal schauen, ob da vielleicht die eine oder andere Methode besser funktioniert und vor allem gezielter. Und das ist dann so ein wenig der schwierige Punkt bei "fremden" Projekten, sich da hineinzuversetzen. Aber, wir kriegen das hin. Ist nur eine Frage der Kommunikation. Wir haben hier schon ganz andere völlig verwirrt und alle übriggebliebenen Klarheiten beseitigt. Äh, ich meinte natürlich total professionell geholfen.

  • Moin,


    Ich habe mich heute morgen nochmal an die Geschichte rangewagt, da mich eines irritiert hat. Ich habe knapp 100 Lichtquellen verteilt, ich weiß etwas viel aber okay. BP_Licht als array habe ich angesteuert mit get all Autors of class und dann Set Intensity sobald ich den Schlüssel aufgenommen habe war dann alles dunkel. Nun habe ich die BP_Leiche als array gesetzt und genau so angesteuert. Tada es klappt. Sicherlich nicht die beste Lösung aber erstmal eine :D


    Tausend dank für eure hilfe.


    Gibt es gute ue5 Kurse auf deutsch die ihr empfehlen könnt?


    Danke Gruß


    Die Fritte

  • Eine Frage hätte ich allerdings noch. Wieso spawnst du die Leichen und setzt sie dann auf invisable, um sie dann bei Bedarf auf visible zu setzen? Wieso spawnst du sie nicht einfach bei Bedarf?

    Ja, also es gibt einige gute YouTuber, die sehr gute und verständliche Tutorials auf Deutsch machen.

    Z.B. der Unreal Engineer: https://www.youtube.com/@DerUnrealEngineer

    Aber auch Mathew Wadenstein ist sehr gut. Das ist zwar auf Englisch, aber er macht halt sehr kurze und verständliche Tutorials, wenn es um den Gebrauch einzelner Nodes, den Gebrauch von Widgets usw. geht. Meistens so 5 - 10 Minuten, halt sehr speziell auf ein Thema bezogen. Sehr hilfreich, wenn man mal was "nachschlagen" will, wie in einem Compendium.

    https://www.youtube.com/@MathewWadsteinTutorials

    • Offizieller Beitrag

    Eine Frage hätte ich allerdings noch. Wieso spawnst du die Leichen und setzt sie dann auf invisable, um sie dann bei Bedarf auf visible zu setzen? Wieso spawnst du sie nicht einfach bei Bedarf?

    So wie ich es verstanden hab, macht er das weil die Leichen Physics haben. Er spawnt sie in der Luft, sie klatschen runter und bleiben Random liegen. Dann blendet er sie aus und ein wenn er sie braucht.


    Optimal ist das nicht


    Eigentlich müsste das Culling das ein und ausblenden übernehmen und nicht so wie du das machst.


    Das Culling blendet ja alles aus was sich nicht im Frustum des Spielers ist. Das Frustum ist der sichtbare Bereich des Spielers.


    Ausgeblendet werden hierbei dinge die weit weg sind aber auch dinge die von anderen dingen überdeckt werden. Also zb etwas was sich hinter einer Wand befindet.


    ich bin mir nicht sicher wie sich dein Vorhaben auf die Performance auswirkt.

    Im Grunde geht es immer daraum: Was ist sichtbar, was muss von der Grafikkarte berechnet und Zeichnet werden.

    Wenn du Simulationen außerhalb vom Sichtbereich machst und auch Berechnungen die für den Spieler nicht sichtbar sind. Dann umgehst du im Prinzip das gesamte Culling und viele Optimierungsansätze der Unreal.


    Es wird soviel Wert gelegt das man nur dinge berechnet die vom Spieler innerhalb eines Frames gesehen werden.

  • So wie ich es verstanden hab, macht er das weil die Leichen Physics haben. Er spawnt sie in der Luft, sie klatschen runter und bleiben Random liegen. Dann blendet er sie aus und ein wenn er sie braucht.

    Ja gut, so weit habe ich das schon verstanden. Aber das kann man doch sicher besser lösen. Nicht, dass ich jetzt wie das Spiel aufgebaut ist oder so, aber ich glaube nicht, dass es irgendein Spiel gibt, das es so umsetzt.

    Natürlich kann ich auch nachvollziehen, wenn man da ein wenig Zufälligkeit reinbringen möchte, das dann so zu machen. Die Frage ist nur, wird Physik auch berechnet, wenn die Gegenstände außerhalb des Sichtbereiches sind? Oder ist das eher so, wenn die Leichen hinter einem spawnen und man steht 10 Minuten einfach nur da, dreht sich dann um und erst dann regnet es Leichen?