Im Blueprint /Multiplayer Outline Objekt

  • Hallo Leute,


    und wieder einmal komme ich nicht weiter.

    Ich habe einen Blueprint das auf ein interface zugreift. Laufe ich mit meinem Character nun auf das Objekt zu, leuchtet es und es erscheint ein Text. Der Server Character sieht das der Client nicht. OK so soll es sein. Wenn der Client drauf zu läuft sieht er es, auch das soll so sein, nur leider sieht das dann auch der Server, dass soll nicht sein.


    Egal was ich versuche der Server sieht das immer. Wie kann ich das ändern das immer nur der entsprechende Character das angezeigt bekommt?

  • Hallo


    Sieht mir nach einem Replication Problem aus. Der ganze Prozess mit diesem Text muss den Server überhaupt nicht interessieren, dass reicht alles lokale ohne replication. Woher callst du das Schau Drauf Event?
    Kannst du ein Screenshot hochladen vom Components tab mit dem griff selected?


    Gruss

  • Hallo Phoenix-100,

    ich danke dir für deine Antwort. Das Problem konnte ich für den Moment lösen, keine Ahnung ob es da bessere Möglichkeiten gib, aber so funktioniert es bis zu einem gewissen Grad.

    Habe den Get Player Pawn und Actor Has Tag eingefügt dan geht es wie gewollt.


    Leider Arbeite ich gerade daran das ganze aus dem Blueprint in der Funktion zu erweitern. Also so wie oben beschrieben wird das angezeigt nun soll beim RMB-klick der Hebel umgelegt werden so das dann ein anderer Blueprint aktiviert wird. Aber egal was ich mache es wird nicht Replectiert. Der server macht es und der Hebel legt sich um und das Bluprint wird ausgeführt. Der Client siet das aber nicht weder das umlegen des Hebels noch das andere ausgeführte Blueprint. Wenn der Client das macht wird der Hebel umgelegt aber das andere Blueprint wird nicht ausgeführt und der Server sieht auch nichts. Habe schon mit zusätzlichen Customevents Run auf Server und Multicast probiert. Irgendwo habe ich einen mächtigen Denkfehler.


    Kannst du dir vorstellen wo der Fehler liegen könnte?

    Gruß

  • Also zunächst einmal sind das zwei verschiedene Dinge. Das Anzeigen des Textes solltest du lokal machen, das interessiert den Server nicht und die anderen Spieler auch nicht.


    Das Umlegen des Hebels hingegen interessiert alle, also den Server und auch alle anderen Clients, also im Sinne von, wenn Spieler 1 den Hebel bewegt, muss er sich überall bewegen.

    Das heisst diese Funktion muss der Server ausführen. Der Client darf das nämlich nicht selbst tun (wegen cheaten).

    Der Client muss also dem Server sagen "ich möchte jetzt hier den hebel umlegen", wenn der Server sagt, ja das ist OK, nur dann wird der hebel vom server bewegt. Wie geht das?

    Du brauchst ein Event das "run on server" ist. Dieses Event führt dann die Aktion aus. Damit alle Clients das wiederum sehen, muss dieser Hebel und der Actor der ihn Besitzt auf "Repliacted" (checkbox) gesetzt sein. Dann wird es zurück auf alle Clients repliziert.

    Also Client ==> Server ==> All Clients.


    Gruss

  • Hallo Phoenix-100, ich danke dir für die Antwort. Ja das Grundprinzipe habe ich verstanden, leider bin ich zu bl.. um es um zu setzen.

    Geht das aus einer Funktion heraus?

    Also ich rufe mit dem Charakter-BP mit Event Tick das Interface ab. Dann ist im Bleuprint das ausgeführt werden soll dass;



    Dan die Funktion Beginn Schau Drauf. und am Ende dann;



    der Auslöser geht dann zum Event Graph des entsprechendem BP;


    Das erste Event ist run on Server und ist Replicated das ruft dan das zweite Event Run Multicast auf und ist Replicated und führt dan die Aktion aus Hebel umlegen.


    Der server macht das alles nur sieht der Client das nicht. Macht der Client das ganze komme ich nur bis Bild zwei. Run on server wie in Bild 3 gezeigt passiert dann gar nicht.


    :?::?:

    Gruß

  • Der letzte Screenshot kann ich leider nicht lesen und konnte dem Code noch nicht folgen.

    Zunächst einmal, könntest du bitte kontrollieren, dass beim Tisch mit dem Hebel:


    1. Dass der Actor die checkbox replicated aktiviert hat.


    2. Dass die Componenten checkbox Component replicates aktiviert haben.


    3. Ob du eine Warnung im output log hast?


    Multicast brauchst du von mir aus gesehen nicht.


    Gruss

  • Hallo Phoenix_100,


    so, ich bekomme das aus dem Blueprint nicht hin. Der Client kann dort nicht Run on Server ausführen. Egal wo oder wie ich es einfüge.


    Ich habe das Problem (Vielleicht hast du noch eine andere Erklärung oder Möglichkeit) wie folgt gelöst.


    Im Blueprint Stellbock, wie oben auf dem Bild "Auslöser Stellbock" habe ich einen Cast to meinem 0-Base Character gesezt. Von dort wird dann Run on Server und Multicast auf dem Blueprint Stellbock ausgeführt, der dann den Hebel verändert.


    Also Caste ich vom Stellbock weg zum 0Base und von dort über Run on Server wieder zum Stellbock. Das wollte ich umgehen und alles im Stellbock-Blueprint ausführen. Aber egal.


    So läuft alles wie gewollt jeder sieht alles egal wer auslöst.


    Ich danke dir recht herzlich für deine Hilfe, bin halt Anfänger.


    Gruß

  • Hallo


    gut dass du das Problem lösen konntest.

    Du kannst es auf dem Stellblock per Default nicht ausführen. Auf dem Client kannst du Funktionen auf dem Server nur auf Objekten ausführen, die eine owning connection haben, also sozusagen dem Spieler gehören.


    Der Spieler muss also die Funktion auf dem Stellblock auslösen, und zwar auf dem Server. Das machst du ja jetzt auch.

    Das Problem mit dem Cast ist aus meiner Sicht aber, dass der Spieler vermutlich mit vielen, vielleicht tausenden von Objekten im Spiel interagieren möchte und du willst nicht alle versuchen zu casten. Persönlich löse ich das am liebsten mit Interfaces. Vererbung wäre auch möglich.


    Viel Erfolg.

    Gruss

    • Hilfreich

    Wirklich sauber kann ich dir das nicht zeigen, aber hier ganz kurz und einfach.

    Per Interface:

    Ich habe das ThirdPersionStarter Projekt genommen. Hier ein Actor_BP gemacht namens Tisch. Hier gibt es eine weiter Komponente Namens Hebel. Beides muss repliacted aktiviert haben. Hier gibts eine Funktion "betaetigen". In dieser Funktion passiert die tolle Aktion mit dem Hebel. Ich gebe hier einfach einen String aus und rotiere den Hebel rudimentär.



    Dann haben wir den Character der mit der E-Taste mit diversen Dingen interagieren möchte. Also mit diesem Tisch, mit der Tür, mit NPCS usw.

    Dazu erstelle ich zuerst ein Interface mit dem Namen E-Interaction. Hier gibt es nur eine Funktion namens E-Pressed. Sonst komplett leer wie du in dem Bild siehst.



    Der Tisch implementiert dieses Interface und ruft die Hebel Betaetigen Funktion auf.



    Nun können wir das im Character ganz einfach ausführen. Ich nehme die Objekte mit dem der Character überlappt, cast nach dem Interface und rufe die E-Pressed funktion, die ich vorhin im Interface leer erstellt habe, auf.



    Wenn jetz der Character mit einem Objekt überlappt, kann die Aktion mit E ausgeführt werden.

    Dabei ist es egal was das für ein Objekt ist. Mit allen Objekten, die das Interface implementieren können wir nun interagieren.

    Du kannst jetzt also eine Tür machen, das Interface implementieren und es funktioniert, am Character musst du nichts ändern und an den anderen Objekten auch nicht. Funktioniert so auf dem Server und den Clients. Cool oder?



    So viel zum Interface.

    Jetzt könnten wir das auch per Vererbung machen,

    Ich erstelle einen neuen Actor_BP und implementiere alle Aktionen auf die ich reagieren möchte.

    In diesem Fall nur per E-Pressed. Die Funktion bleibt aber leer hier.



    Der Tisch nun erbt von diesem BP. Wenn du einen neuen BP erstellt musst du immer einen Parent wählen. Wenn du Actor auswählst, heisst das, dass dein neuer Blueprint vom Actor erbt. Du hast also Vererbung schon verwendet. Du kannst also durch das Erstellen eines neuen BP direkt erben oder du änderst es bei einem bereits existierenden Blueprint unter File -->Reparent Blueprint.

    Der Parent vom Tisch ist jetzt hier der neue InteractionObject_BP und nicht mehr Actor wie zuvor beim Interface Beispiel.

    Nun kannst du die Funktion E-Pressed überschreiben. Überschreiben heisst du Funktion vom Parent mit einer eigenen ersetzen oder erweitern. Das sieht wie folgt aus.


    Im Character können wir nun nach dem InteractableObject Casten, von dem der Tisch erbt und die Funktion aufrufen.


    Der Vorteil ist jetzt hier, die Türe kann auch von diesem InteractableObject erben. Das heisst du musst im character nichts ändern und kannst mit tausenden von verschiedenen Objekte interagieren.


    Das ist jetzt hier etwas gar schnell entstanden und nicht besonders sauber. Aber ich hoffe du siehst wie es funktioniert.


    Gruss

  • Hallo Phoenix-100,


    ich danke dir sehr für die Ausführungen. Ich werde das bei Zeiten mal ausprobieren. Du Castest ja zu dem Interface !!

    Da hatte ich nicht dran gedacht und hatte das auch noch nicht gehabt, klinkt aber einleuchtend. Wieder etwas gelernt. Jetzt fehlen mir nur noch 999999 Dinge. :laughing:


    Besten Dank. :__


    Gruß

  • Hallo zusammen


    Feal das freut mich sehr!

    Also die InteractionCapsule ist einfach eine weitere Capsule Component die etwas nach vorne gerichtet ist. So stelle ich fest was für Objekte sich vor dem Character befinden. Das musst du am besten zuerst einmal ausprobieren, dass du sicherstellt dass das overlapping richtig funktioniert. Also einfach einmal alle overlapping Objekte ausgeben und sicherstellen, dass dein Tisch auch tatsächlich darin enthalten ist.


    Dass der Cast nach dem Interface fehlschlägt ist durchaus normal, wenn es andere Objekte sind die das Interface nicht implementiert haben. Du kannst ja den Namen des Objektes ausgeben. Wenn du das interface richtig hinzugefügt hast, funktioniert auch dieser Cast zwingend.


    Gruss

  • Also ich habe einen neuen Blueprint Name "Variablen" dort dann eine Funktion Name "RMB" Bild 1.



    Dan ein Blueprint Name"tes_cube" mit einem Cube. Dort habe ich dann die Funktion von den Variablen reinkopiert und dann dir der Funktion etwas angehängt. Bild 2



    Im Character_BP habe ich das wie in Bild 3:


    das Cast zu den Variablen geht nicht also feuert er nicht zu RMB.


    Wenn ich Get Actor of Class anstelle von Cast to nehme feuert er RMB aber führt das dann nur bei den Variablen aus .

    Parent des Tes_Cube ist Actor genauso wie die Variablen_BP


    Wenn ich bei den tes_Cube dan parent Variablen auswähle bekomme ich dei Fehlermeldung das die Funktion RMB schon forhanden ist.


    was mach ich falsh??


    Gruß

  • Stelle nochmals sicher, dass der Parent die Variablen BP ist. Files->ReparentBlueprint->Variablen.

    Der Fehler ist der, dass du die Funktion neu erstellst, du musst die aber überschreiben.

    Du machst das auf der linken Seite unter Functions. Dort auf das Plus und dann overwrite und die RMP methode auswählen.

    Falls diese dort nicht vorhanden ist, ist der Parent nicht die Variablen BP.


    Gruss