// Edit
Wir casten zuerst zum Tür Blueprint und übergeben Ihn dann mit dem Event. Du kannst das ganze aber auch auf dem Server machen, ist hier nur damit es erstmal funktioniert.
Beiträge von Phoenix-100
-
-
Gut, mal eine vorläufige Lösung bevor wir zur richtigen kommen.
Also, das ist der PlayerController. Wenn ich X drücke soll die Türe geöffnet werden. Vorläufig soll einfach die eine Tür in der Scene geöffnet werden (schau das du nur eine in der Scene hast oder wähle sie per Tag aus).
Das Event habe ich Server genannt. Es ist On Server. Tür öffnen ist mein Event im Tür Blueprint, also das Event das du vorhin dort erstellt hast und auf nicht repliacted gesetzt hast. -
Also den Fehler den ich meine ist no owning Connection. Wir müssen das also so definieren, das ein Actor mit owning Connection das Event auf dem Server ausführt.
Jetzt können wir einfach "Set Owner" machen bei der Tür. Macht aber wenig Sinn, die Türe gehört ja nicht einem Spieler.Jetzt könnten wir das Problem auch einfach lösen indem wir das Event, dass du in der Türe hast auf not Repliacted setzen und dieses Event von ausserhalb, dem PlayerController aufrufen.
Damit das funktioniert müssen wir einen PlayerController erstellen, weisst du wie das geht bzw. hast du schon einen eigenen erstellt? -
Wenn du in in der Engine in der Menüleiste unter Windows => Developer Tools => Output Log öffnest, wirst du in diesem Log eine Warnung sehen. Stimmt das?
-
Hey
Du musst einfach darauf achten, dass das Run on Server auf einem Objekt ausgeführt wird, der auch eine owning Connection hat und somit auch Events auf dem Server durchführen kann.
Gruss
-
Hallo
Ich vermute den Grund für dieses Verhalten darin, dass du bei Client1, bei ListenServer als Server spielst.Etwas genauer:
Der Server behält sich die Autorität über die Replicated Objekte. Das bedeutet, wenn du nun die Replicated Türe auf dem Server bewegst, bewegt Sie sich auch entsprechend auf den Clients, wie du es beschreibst funktioniert das ja.
Wenn du das aber auf Client 2+ machst, geht das nicht mehr, weil er nur der Client ist somit nur die lokale Kopie bewegt. Du musst die Türe also auf dem Server bewegen, der das "echte" Objekt besitzt, nicht auf dem Client.
Wie machst du das?
Du erstellst ein Custom Event. Bei diesem kannst du einstellen wo es ausgeführt wird. Du willst hier "Run on Server", damit es auf dem Server ausgeführt wird.Gruss
-
Hallo zusammen
Steam kann man übrigens auch für Listen Server nutzen, nicht nur für Dedicated Server.
Und @SharkBytes tolle Erklärung auf den Punkt.
Gruss
-
Hallo Timer
ApplyDamage dient wirklich nur, nunja, um Schaden zuzufügen. Was das genau heisst musst du selbst definieren. Meiner Meinung brauchst du immernoch eine Variable mit Leben. Meinst du bei Fragen 1. ein komplettes System oder wie?
Zu Frage 1.
Alles was von der Actor Klasse erbt hat das Damage System integriert. Meiner Meinung nach gibt es nichts wie Tode oder sowas wie du es beschreibst, also built in. Also diese Variablen musst du schon selber definieren.
Also nun zu ApplyDamage. Das wird von irgendetwas ausgelöst das, nunja, Schaden verursacht. Es löst auf der anderen Seite dann ein DamageEvent aus.
Es gibt verschiedene Nodes um Damage zu verrusachen und verschiedene Events um darauf zu reagieren.
Hier ganz kurz.
Point Damage: Spezifische Point kriegt Schaden. Die Node im BP nennt sich ApplyPointDamage.
RadialDamage: Punktschaden mit Umkreis. Gibt es auch mit Falloff. ApplyRadialDamge und ApplyRadialDamagewithFalloff.Die Events um darauf zu reagieren heissen entsprechend.
Sagen wir jetzt einmal irgendeine Gewehrkugel führt ApplyPointDamage aus nachdem Sie einen Character getroffen hat.
Beim getroffen Character wird nun u.A. das Event "PointDamage" ausgelöst. Nun kannst du entscheiden wie du darauf reagierst. Zum Beispiel in dem du den Schaden der hier übergeben wird von dem Leben vom Character subtrahierst.Das reicht je nachdem natürlich nicht für die Schadensunterscheidung. Du kannst bei ApplyDamage noch den DamageTyp definieren, wie auch immer du es zur Unterscheidung brauchst.
Gruss
-
Hallo zusammen
So einfach lässt sich das gar nicht beantworten - zuerst gibt es noch andere Fragen zu berücksichtigen.
Es gibt einerseits Listen Server, einfach gesagt, "spielt" hier der Host auch als lokaler Spieler mit.
Das andere ist der Dedicated Server, er bietet üblicherweise Performance Vorteile, weil er nicht alles ausrendern muss, auch kein Audio etc., daher er nicht als lokaler Spieler mitspielt ist das nicht nötig, einfach gesagt.
Listen Server bietet oftmals Kostenvorteile und je nachdem ist er einfacher Skalierbar, weil die Clients selber hosten können. Beim Dedicated Server musst du dann üblicherweise Server hinzuschalten um Spitzlast zu überbrücken. Das ist je nachdem nicht ganz so einfach, als Tipp hier Cloud Computing. Es gibt auch Architekturen die auf beides zurückgreifen.Für den Spielmodus wird üblicherweise der GameMode benutzt.
Was genau mit den Räumen meinst du, levels? Level Transition kannst du auch im GameMode regeln.Jetzt wie startest du die Server?
Die UE4 hat das Built in bereits dabei, ja, wirklich!
Du kannst ihn einfach per Command Line starten. Aber es geht sogar in der Engine unter Play kannst du mehrere Spieler automatisch verbinden oder sogar ein Test Dedicated Server per Checkbox starten.Gruss
-
Ja ähh tja, das war also nicht das Problem.
Was genau ist denn anivisiertes Ziel für eine Variable?
2. Dann hast du dieses Array Zeichen zwischen Gegner in Range und dem Get, um es mal plump zu sagen.. mach das mal weg
@Harlyk Hat dir diese Array Referenz Geschichte mal Probleme bereitet oder wie ist das zu verstehen?Gruss
-
Hallo zusammen
Könnte man hier nicht einfach Scaling Rule auf Horizontal setzen in den Settings unter User Interface?
Bei einem solchen Format wäre das doch sinnvoll?
Gruss -
Nun mit den neueren Versionen der Engines kannst du wenn du ein Objekt aus einem Array entnimmst, vereinfacht gesagt, entweder eine Kopie davon haben oder eine Referenz.
Du scheinst eine Kopie davon zu nehmen. Wenn du ein original Blatt kopierst und die Kopie veränderst, ist das Original noch immer identisch wie zuvor.
Deswegen musst du das Objekt Referenzieren, wir wollen ja schliesslich das original verändern, richtig?
Also wenn du dein Array als eine Variable im Vieport hast und dann Get eintippst, erhälst du zwei Obtionen:1. Get a Copy
2. Get a ReferenceWir wollen eine Referenz.
Falls du eine neuere Engine Version nutzt, hast du eine Kopie genutzt in deinem ersten Screenshot beim Get vom Array. Verstehst du?
Also was du austauschen solltst ist die Get Node im ersten Screenshot durch Get (a ref) -
Alles klar, hat der Austausch vom Get a Copy durch Get a Reference das Problem noch immer nicht gelöst?
-
Ich bin gerade etwas verwirrt, wieso sind bei deinem Feuerball zwei Vectoren gelistet, ist es nicht immer null?
Als erstes kommt mir in den Sinn, hast du dein Get auch als Referenz und nicht als Copie genommen, bei deinem Get oben wo das anvisierte Ziel definierst, scheint nämlich so als machst du da eine Kopie, dann funktioniert das nicht.
Nochmals die Frage ist es ein Multiplayer Spiel? -
Könntest du mal die Position vom Capsule Component ausgeben lassen, ich vermute das da einfach FVector (0,0,0) ist.
Falls die Position in diesem Blueprint, von dem du die Screenshots gepostest hast korrekt ist, vermute ich das nächste Problem im Feuerball selbst.
Es ist keine Multiplayer bzw. dedicated Server oder?Gruss
-
Das wiederum dürfte daran liegen, dass du wenn das Array 1 lang ist, du aber auf das Objekt nummer 2 zugreifst.
Also wenn die Länge 1 ist, muss du ja auf die 0 zugreifen um das erste Objekt zu kriegen. -
-
Hey
Du kannst wieder Draw Debug Type aktivieren und dein Out Hit mal mit Print String ausgeben lassen, so siehst du was getroffen wird.
Nicht der Cast ist das Problem, sondern das einfach etwas anderes getroffen wird, etwas das nicht von deinem Objekt erbt in das du du Casten willst => Cast failed.
Du benutzt ein SingleLineTraceByChannel, was bedeutet das wirklich nur der erste Hit zählt.
Also einfach anzeigen lassen, ausgeben lassen und dann debuggen.Gruss
-
Hi
Das Generated Header File muss das letzte include sein.
Also #include "DeinCoolesProjekt.generated.h" muss der letzte include sein.
Gruss -
Hallo zusammen
Ich will dich eigentlich nicht nochmal damit langweilen, aber diese Regeln gehören meines Erachtens in den GameMode und nicht in die Gameinstance.
Ehrlich gesagt weis ich auch nicht ganz was du da vor hast. Aber ich behaupte, dass der Grund das dein Klick event nicht funktioniert, ist das es schon nicht mehr im Speicher ist, also dass das Objekt das du bei "Round1" übergibst nullptr, also sozusagen leer ist.
Um das zu reparieren musst du es in einer Variablen speichern. Also einfach Rechtsklick auf den return Wert vom Construct und to Variable klicken. Diese kannst du nun verwenden für das "Round1" Übergabe Event.Wie @Darkentik schon erwähnt hat, gibt es viele, viele verschiedene Wege um dein Spiel umzusetzen, also vom Aufbau her.
Hier mal mein Vorschlag.
1. Erstelle ein Hauptmenu Widget mit Buttons zu den verschiedenen Tischen.
2. Adde dieses Widget im Levelblueprint von deiner Hauptmenu map.
3. Erstelle für jeden Tische eine Map.
4. Verknüpfe diese Maps mit dem Hauptmenu, also per Button sollte jeder Tisch / Map geöffnet werden.
5. Erstelle einen GameMode in dem die Turnorder geregelt wird, also wer wann dran ist.
6. Erstelle einen PlayerController in dem du die möglichen Aktionen vom Spieler definierst.Wie gesagt kann man über die Architektur immer streiten - oftmals auch zurecht