Bedingt Material verändern per Blueprint.

  • Hallo zusammen.


    Ich habe wieder einmal eine Frage zu einem Problem das bestimmt wieder leicht zu lösen ist. Zumindest hoffe ich das, aber leider stehe ich mit Texturen bei der Unreal Engine etwas auf Kriegsfuß. Zumindest wenn es um das farbige aufpappen einer Textur hinaus geht.


    Und zwar habe ich folgendes Problem. Ich habe ein Material erstellt, das durch Bedingungen im Blueprint eines Actors verschiedenen Zustände in der Farbe annehmen soll. Davon habe ich dann eine Materialinstance erstellt.


    Das Material funktioniert auch soweit. Ich habe dann per Material Parameter Colection die Parameter im Material gesetzt, so das ich im Blueprint auch drauf zugreifen kann. Auch das funktioniert sehr gut.


    Dazu habe ich im Construction "Create Dynamic Material Instance" benutzt um dem Actor die Materialinstance zuzuweisen. Bzw. hier beginnt wahrscheinlich das Problem, denn ich dachte immer, dass dann eine neue Instanz des Materials erstellt wird.


    Nun habe ich den Actor im Level platziert, die einzelenen Bedingungen durchgespielt, und es funktioniert wunderbar.


    Bis ich den selben Actor dann daneben noch einmal setzt. Wenn ich bei einem Actor dann die Parameter setze ändern die sich beim zweiten ebenfalls. Zumindest angezeigt. Denn wenn ich beide Actoren vergleiche haben sie unterschiedliche Parameter, zeigen jedoch das gleiche an. Ich vermute mal, dass das daran liegt das beide die selbe Materialinstanz haben. Wenn ich jetzt das Original Material nehme und die Parameter änder haben sie zumindest die gleichen Einstellungen, und zeigen natürlich auch das gleiche an.


    Nur ich kann ja nicht für 200 Objekte dann 200 einzelne Instanzen machen. Das muss doch irgendwie anders gehen, oder nicht?


    Vielen Dank im Voraus.

  • Ohne den BP zu sehen tippe ich mal darauf das Problem ist die Referenz. Sprich du hast ne Referenz zu der einen Instanz und wenn du die änderst änderst du die alle. Stell sicher dass jeder actor die Instanz erstellt und auch über „set“ ne Referenz festlegt. Kannst das ja Testen indem du per Zufallsgenerator ne Farbe setzt oder so. Ich würd mir auch überlegen was du willst. Setzt du 200 actors „händisch“ dann warum nicht auch händisch die Parameter einstellen. Versuch die doch mal programmatisch zu spawnen wenns darum geht das händisch setzen ätzend ist.

  • Ja, am Ende soll ja der Spieler die Möglichkeit haben einige Sachen selber zu setzen, bzw. zu bauen.


    Das Problem ist halt das "Create Dynamic Material Instance" nicht als Referenz zurückliefert. Ich habe das mit Get Class jetzt zwar mal konvertiert, aber scheint nicht zu funktionieren. Gut, ich habs auch nur mal eben kurz ausprobiert, vielleicht habe ich da ja noch nen Fehler drin.

  • Ich habe jetzt mal einiges ausprobiert. Funktionieren tut es aber noch immer nicht.


    Kann es vielleicht sein das es gar nicht am Material liegt, sondern an der Material Parameter Collection?


    Die benutze ich ja im Material, um per BP auf die Parameter halt zuzugreifen. Kann es vielleicht sein, dass diese bei der Materialinstanz gar nicht mit instanziiert wird? Sprich die eine Änderung der Parameter ändert halt den Zugriff von allen Objekten auf diesen Parameter?

  • Wenn ich mir die Doku zu Material Parameter Collection anschaue, bekomme ich den Eindruck das sie genau dafür da sind was Du als Fehler siehst.

    Das heißt globale Werte zu setzen in allen Materialen die die MPC benutzen.

    Die benutze ich ja im Material, um per BP auf die Parameter halt zuzugreifen.

    Wenn Du Parameter im Material ändern möchtest musst du sie auch als Parameter anlegen.

    Einfach per rechtsklick umwandeln.


    Danach kannst Du im Actor_BP die Werte ändern.

    https://docs.unrealengine.com/…erialInstances/index.html

  • So, nachdem ich nun das Problem nochmal unter die Lupe genommen habe erscheint es mir recht logisch das mein Ansatz nicht funktioniert, ich weiß momentan nur nicht wie ich es lösen kann. Wahrscheinlich gibt es für die Lösung eine Funktion, die ich nicht finde.


    Ich habe nun, wie oben in den Bildern zu sehen, eine Dymaic Material Instanze erstellt und in einer entsprechenden Variablen gespeichert.


    Das Hauptproblem ist nun, die Funktion "Set Scalar Parameter Value" hat kein Target. Sprich, ich kann diese vorher erstellte Variable mit dem Material nicht als Ziel angeben. Es gibt dort ja nur die Kollection, worin die Parametercollection angegeben wird, dann den Parameter Name, eben halt aus der Collection, und den Parametervalue, sprich ich kann noch den Wert ändern. Aber als Target die dynamische Materialinstanz auswählen kann ich nicht.


    Ich habe auch schon danach gegoogelt. In den meisten Lösungsansätzen gibt es in der Funktion ein Target. Ich nehme mal an, dass sich das mit verschiedenen Versionen von Unreal geändert hat. Aber wenn sich das geändert hat gibt es bestimmt eine Ersatzfunktion auf die ich nun zugreifen kann. Nur die finde ich leider nirgendwo.

  • Ich ändere aber nicht die Textur. Ich habe für die Ampel eine Maske. Diese Maske kann die Farbe wecheln. Sprich ich habe einen Lerp dazwischen. Und mit mit der Parametercollection ändere ich schlicht den Alphawert von diesem Lerp, so das ich dann halt von Rot auf Grün wechsel.



    Ampel ist vielleicht übertrieben, eigentlich ist es nur eine Schalterstatusanzeige. Die Mask ist halt die Form des Schalters die leuchten soll. Ist die Anzeige grün soll sie halt hell leuchten und grün sein, ist der Schalter aus soll er rot sein und schwach leuchten. Das macht er ja auch beides sehr gut. Also da nehme ich den Fehler einfach mal nicht so an.

  • Ah, danke. Ich wusste doch da gibt es noch mehr. Probiere ich mal aus.


    Viele Tutorials und Bücher sind ja leider recht knapp gehalten. Von daher gehe ich einfach mal davon aus nicht alles zu kennen. Aber solange ich noch Möglichkeiten des Probierens habe, dank dieses Forums, wird es schon irgendwie weiter gehen :)