Eigene (default) String Werte für Türen (Actor Instances)

  • Hi Leute,



    ich versuche gerade ein kleines Tür / Schlüssel System in UE4 zu bauen. Dafür habe eine Tür eine die man abschließen kann als Blueprint mit einem Namen implementiert. Wenn ein Schlüssel mit dem gleichen Namen im Gepäck des Spielers ist, kann die Türe verschlossen oder geöffnet werden. Das funktioniert alles.



    Nun suche ich einen einfachen Weg den Türen unterschiedliche Namen zu geben. Wie schatzkammertuer, haupttor, gartentuer. Der Schlüssel schluessel_schatzkammertuer würde die Schatzkammer öffnen, einfach über einen vergleich von 2 Strings. Einfach zu nutzen und recht effizient.



    Nun kommen wir zum Problem: Wie weise ich unterschiedlichen Türen (Instanzen vom Actor Door) im Editor unterschiedliche Namen zu? Name ist einfach ein string mit dem default value "unbenannte_tuer". Ich kann natürlich über die Level Blueprint jeder Tür im Level einen Namen geben, aber da wird man ja bescheuert bei. Cooler wäre es, wenn ich auf eine Tür im Leveleditor klicken könnte, und unter Details den Namen ändern könnte oder so. Hat jemand eine Idee, wie das gehen könnte?

  • Heisånn,


    Ich bin mir etwas unsicher ob ich so recht verstanden habe, was du genau meinst. Wenn ich dich richtig verstanden habe, dann existieren in deinem Spiel unterschiedliche Türen (Anzahl unbekannt) und zu jeder Tür soll auch ein Schlüssel existieren (der nur zu dieser einen Tür passt). Jede Tür mit einem String zu benennen, scheint mir etwas aufwendig. Wenn das ganze generiert ist, würde ich mit einer Integer für jede Tür arbeiten. Bsp. Tür 546 braucht Schlüssel 546 (oder Schlüssel 892 what ever) um sie zu öffnen. Mit der gleichen Integer hast du den Vorteil, dass du beim triggern einfach nur vergleichen musst.


    Wenn Tür-ID = Schlüssel-ID --> Tür öffnen :)


    Gruss
    Tio

  • Hi Tio,


    danke für deine Antwort. Du hast die Idee richtig verstanden. Ich habe möchte ein System bauen das man in verschiedenen Leveln nutzen kann um Türen mit einem jeweils dazugehörigen Schlüssel zu öffnen. Strings benutze ich, damit man am nächsten Morgen noch weiß dass der Schlüssel auf Nachtttisch des Barons zur Schatzkammer gehört. schluessel_schatzkammer ist da besser als Schlüssel 546 :P.


    Das Problem ist aber noch ungelöst:


    Ich möchte jeder Türe einfach eine ID (in dem Fall einfach eine String Variable mit dem Namen name) zuweisen. In der Blueprint gibt es diese Variable mit dem default wert "unbenannte_tuer". Ich plaziere jetzt 10 Türen in meinem Level. Jetzt möchte jeder Türe einen Namen geben (zum Beispiel schatzkammer). Wie mache ich das am besten?


    Kann ich jeder plazierten Türe einen Wert für die Variable Name geben, ohne ihn via Level Blueprint zu zuweisen. Jeder Türe ist ja eine Instanz der Blueprintklasse Tuer. Kann ich also einer Variable einer Instanz einer Klasse einfach über den Editor einen anderen default Wert zuweisen, als in der Klasse selber?


    [Blockierte Grafik: https://forums.unrealengine.com/attachment.php?attachmentid=107921&d=1472585076]

  • Warte mal, verstehe ich das richtig? Ich muss eine Blueprint Klasse duplizieren um den Instanzen unterschiedliche (default) Werte zu geben, weil es im Editor nicht geht? Ich bin leicht schockiert von UE4, bis jetzt konnte ich für fast alles eine elegantere Lösung finden.

    • Offizieller Beitrag

    mhm, ich versteh nicht so ganz. Wenn zB eine Tür mit den Actor Name Tür heißt und du die mehrmals in die Welt einfügst. Dann heißt die erste Tür Tür, die zweite Tür1, Tür2, Tür3 usw...
    Dein BP Actor exestiert nur einmal in dein Content. Es wird also nur dieser eine Script abgespielt. Wenn du in diesen einen Script einen Namen vergibst, dann funktioniert sie auch. Gibst du ein 2. namen, ist das Problem da, es sind nun 2 Namen vorhanden. Woher will das System jetzt wissen, dass diese Tür zu diesen Namen gehört.
    Beispiel: Schlüssel darf nur Karl haben.
    Wenn du zB 2 Kumpels vor dir zu stehen hast. Der eine heißt Karl, der andere Horst. Beide sehen unterschiedlich aus und beide haben unterschiedliche Namen. Ich weis also, wen ich den Schlüssel überreichen darf. Wenn es Zwillinge sind und der eine heißt Karl und der andere Horst, dann frage ich nach, wer wer ist und somit kann ich auch den Schlüssel übergeben. Aber wenn beide Zwilinge Karl heißen, was machst du dann?
    Somit musst du für jede Tür ein Actor erstellen mit unterschiedlichen Namen. Da ist ehrlich gesagt, nix schockierendes drann.

  • Ich komme ja aus der C++ Ecke:


    class Door
    {
    String name;
    };


    Door door1;
    door1.name="schatzkammer";


    Door door2;
    door2.name = "haupt_tor";


    Door door3;
    door3.name="zimmer_von_der_jungen_dienstmagd_in_unterwaesche";


    Dort haben wir eine Klasse und 3 Instanzen. Jede Instanz hat ihre eigenen Namen. Das ist was ich im Editor versuche nachzustellen. Das ich möglichst einfach die Variablen von door1, door2, door3 zu initialisieren bzw. zuzuweisen. Und nein es gibt keinen Screenshot von der jungen Dienstmagd :p.

  • Verstehe jetzt nicht so ganz das Problem.


    Du hast eine Tür als Blueprint und gibst der Tür eine Stringvariable Name.


    Nun setzt du die Tür in dein Level und gibst der Variablen den Wert Door1 als Name, setzt die zweite und nennst sie Door2.


    Willst du es automatisieren packst du bei der Initialisierung ein vorab gefülltes Array mit Namen rein die automatisch vergeben werden oder du arbeitest mit einer Datenbank.


    Die Türen einzeln zu benennen ist jedenfalls das Gleiche was du in deinem c++ Code gemacht hast.

  • "Ist dieser Script nur ein Beispiel um mir es genauer mitzuteilen? Oder funktioniert der !?"


    Nur ein Beispiel.


    "Du hast eine Tür als Blueprint und gibst der Tür eine Stringvariable Name."
    Genau


    "Nun setzt du die Tür in dein Level und gibst der Variablen den Wert Door1 als Name, setzt die zweite und nennst sie Door2."
    Hier ist das Problem. Ich bin etwas unerfahren mit dem Ue4 Editor. Wie mache ich das am besten? Mit meinem Kenntnis-Stand, würde ich in die Level Blueprint gehen und dort eine Referenz auf die konkret plazierte Türe nehmen und da den String setzen. Aber das ist zu umständlich um das von einem Level Designer machen zu lassen. Ich würde mich freuen, wenn man auf die plazierte Türe klicken könnte, und dort den Namen einfach in den Details eintragen könnten.

  • Ist doch ganz easy ;)


    Bild1 :


    1 - Erstelle eine Variable "Door Name"
    2 - Stell auf Editable damit man es ändern kann.
    3- Stell auf Expose on Spawn damit die Einstellung in den Details sichtbar wird.
    4 - Erstelle eine Kategorie sofern du etwas mehr Übersicht haben möchtest.
    Komiliere jetzt sonst kannst du kein Defaultwert einstellen
    5 - Stelle ein Default Wert ein "Ubenannte Tür" oder wie auch immer.


    Bild 2 :
    Platziere nun dein Blueprint in deiner Level, klick auch Details und voilà trage den Namen ein den du gerne hättest.
    Das kann dann doch jeder oder ?


    Ist nicht so schwer

    • Offizieller Beitrag

    achtung, kann unübersichtlich werden.


    Aber teste zuerst, ob das cooken funktioniert.wenn das projekt gepackt wird, werden zb collisionswerte nicht mehr übernommen und nur vom content übertragen. Fals man die auf diese weise ändert. Das kann jetzt genau das gleiche passieren, dass die eingestellten variable im editor nur für play funktioniert und nicht für launch. Entweder ein bug, oder so gewollt. Harlyk wollte ich das noch erklären, denn wir mussten ein projekt retten und das war der fehler. Vorschau funktionierte, aber das packen hatte die collisionswerte nicht übernommen, die im editor geändert wurden.