Multiplayer - nutze ich RPC falsch?

  • Also ich arbeite derzeit an einem Multiplayer game.


    Für den Schwertangriff nutze ich einen RPC (Auf Server). Der fragt ab wie der Skill ist, berechnet ob ich treffe, speichert das in einer Variable ab, spielt die Animation und ruft dann einen zweiten RPC (Multicast) auf. Der Multicast nimmt die Variable die der Server brechnet hat und spielt dann ANimation usw auf den Clients per Multicast ab.


    Ja ich weiss klingt erst mal kompliziert aber die Spieler sind beide "AI controlled" - siehe "Top Down" template von UE4. man sieht sein männchen von oben, steuert es aber nicht direkt sondern klickt nur nen Punkt im navmesh an und es läuft dann irgendwie dahin.


    Das mit dem Schwert klappt Super, ich hab da tolle Schwertprügeleien mit blocken, klirren usw. Alle glücklich



    Jetzt mache ich aber das gleiche mit nem Bogen und weil man nen Bogen spannt und zielt - was ja etwas zeit kostet - dachte ich ich bin schlau und mach einfach ein delay rein.

    Saudumm. Natürlich durchläuft der RPC auf dem Server das delay und ruft DANACH den Multicast RPC auf.


    Ich wollte jetzt intuitiv alles in Macros packen und vielleicht kann ich beides gleichzeitig aufrufen oder so? Oder ist meine Vorgehensweise grundsätzlich Grütze?


    Bonus frage - kann ich mir den Delay sparen? Gibt es eventuell so ne art "On finished playing animation" event oder sowas? Dann könnte ich einfach die Animation schneller oder langsamer spielen lassen und gut ist, keine delays mehr...



    PS: Haut mich nicht! ich frag ja eigentlich sehr selten was...

  • Es gäbe Möglichkeiten über das Animation Blueprint Events in Animationen zu erfassen. Es ist jedoch meiner Meinung nach ein schlechtes Design Gameplay relevante Dinge an Animationen zu koppeln, da nicht garantiert ist, dass diese abgespielt werden (z.B. dedicated Server)


    Ich würde auch eher Timer statt delays nutzen. Delays sind übersichtlich, aber mit Timern hast bildest du besser ab was unter der Haube passiert und hast somit ein besseres Verständnis was den Programflow angeht. Bei Timern hast du auch den Vorteil dass du entsprechende Events hast, wenn dieser endet.


    Was die RPCs angeht, ist ja dein Problem einfach. Du solltest den RPC im Grunde aufrufen, wenn der Angriff initiiert wird und nicht erst wenn getroffen wird.

  • Bonus frage - kann ich mir den Delay sparen? Gibt es eventuell so ne art "On finished playing animation" event oder sowas? Dann könnte ich einfach die Animation schneller oder langsamer spielen lassen und gut ist, keine delays mehr...

    Animation Notifies wären hier die richtige Lösung. Vermutlich gibt es sogar ein on finished playing animation event

    Für dein Problem würde Ich vorschlagen, den Bogen wie gewohnt bei dem Schwert abzuschießen, und den Pfeil zu replizieren. Einfach einen replizierten Pfeil spawnen. Wenn er auf dem Server trifft, verursacht er Schaden, der erst dann berechnet wird (außer Pfeile treffen immer), auf dem Client allerdings nicht.

    Ich bin blos von deiner Beschreibung etwas verwirrt. Der Server berechnet Schaden und spielt dann die Schwert-Animation ab und danach wird erst ein event auf den clients getriggert, das die Animation dort abspielt?
    Ist das jetzt zeitlich oder flowtechnisch zu betrachten? :D