[MY-RS] Interaction avec des objets non-joueur sans lag sur chaque clients

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
Shifty
Messages : 17
Inscription : 27 Mars 2016 20:50

[MY-RS] Interaction avec des objets non-joueur sans lag sur chaque clients

Message par Shifty » 25 Avr 2017 12:44

Bonjour,

Je suis en train de créer un jeu multijoueur qui ressemble très fort à un match de football que l'on pourrait voir à la télévision, à l'exception qu'il peut y avoir plusieurs balles sur le terrain.

Je suis confronté à un problème dont je ne trouve pas la solution sur le net. Actuellement, dans mon jeu, lorsqu'un joueur client essaie de shooter une balle pour la faire avancer, le client exécute une fonction de type [Command] pour notifier le serveur que le joueur client à bien effectuer un shoot sur la balle et donc modifier la trajectoire de la balle sur chaque client.

Mon problème est que le temps qu'un joueur client shoot sur une balle et que le serveur met à jour la trajectoire de la balle, peut prendre un certain temps.

Je me suis renseigné sur une potentielle solution, qui est de donner l’autorité aux client de pouvoir directement depuis leur instance de jeu, de modifier la trajectoire de la balle sans passer par une fonction de type [Command] (grâce à NetworkIdentity.AssignClientAuthority), mais il n'est pas possible de donner cet autorité à tout les joueurs.

En bref, y a t-il un moyen qu'un client qui shoot dans une balle, voit instantanément que la balle change de trajectoire ?

Merci d'avance :)

Avatar de l’utilisateur
evereal
Messages : 109
Inscription : 06 Nov 2015 18:46

Re: [MY-RS] Interaction avec des objets non-joueur sans lag sur chaque clients

Message par evereal » 25 Avr 2017 16:20

Hello,

Alors, pour n'avoir aucun lag sur chaque client ben il faudrait que tout le monde se trouve juste a coté du serveur (et encore).
Il n'y a pas de solution simple, on peux supprimer le lag apparant grâce a des méthodes de prédiction, réconciliation, interpolation.

En très gros, la prédiction consiste a prédire les infos que va nous envoyer le serveur.
Je tape sur la balle, j’envoie l'information au serveur pour qu'il applique le mouvement a la balle, de mon coté j'applique déjà un mouvement a la balle en croisant les doigts pour qu'il soit identique a ce qu'il se passe sur le serveur.

La réconciliation arrive après la prédiction.
Sur mon exemple, j'ai été trop prétentieux et envoyé la balle un peu trop loin par rapport a ce qu'il c passé sur le serveur, du coup je téléporte la balle a sa vraie position. Si le calcul n'était pas trop mauvais, ça peut être complètement invisible pour le joueur.

Pour des jeux pas trop nerveux, ces 2 concepts sont déjà suffisant. Pour des fps ou chaque 100eme de seconde compte on fait appel a l'interpolation.
La le serveur va retenir son état passé. il retient la liste de toute les entrées pour une petite durée définie. Il renvoi a chaque joueur une image passée. Le joueur étant lui dans le présent, chaque action qu'il enverra au serveur sera recalculée pour la matchée avec l'état passé.

Je te propose un peu de lecture pour mieu comprendre tout ca
http://www.gabrielgambetta.com/fpm1.html
http://www.gamasutra.com/blogs/Christia ... _HLAPI.php
http://www.gamasutra.com/blogs/Christia ... onents.php

Ha et l'idée de donner l’autorité de la balle a un joueur -> poubelle. En plus d'être stupide ça ne règlera en rien ton problème de lag.
“La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : Rien ne fonctionne... et personne ne sait pourquoi !”

Shifty
Messages : 17
Inscription : 27 Mars 2016 20:50

Re: [MY-RS] Interaction avec des objets non-joueur sans lag sur chaque clients

Message par Shifty » 29 Avr 2017 11:00

Bonjour,

Merci pour ta réponse :)

J'ai lu ta documentation et je comprends bien comment fonctionne les 3 méthodes que tu décris. Je cherche à mettre en place un système de prédiction comme tu l'explique dans ton message précédent. Actuellement, je ne sais pas comment faire pour mettre en place :( (parce que d'après ce que j'ai compris, ce n'est n'est pas possible de modifier un GameObject dont on n'a pas autorité dessus avec UNET). Si tu as une implémentation d'une méthode de prédiction sur Unity, je veux bien y jeter un œil :)

Dans mon message précédent, j'expliquais que à force de chercher une solution, j'ai trouvé une idée, mais je ne sais pas si elle est réalisable où pas. Je t'explique ma manière de penser. Je veux que le client qui shoot la balle modifie lui-même la vélocité de cette balle (non pas le serveur !) en prenant autorité sur le gameObject de la balle (pour un souci de réactivité). Et grâce au NetworkTransform de la balle, la position de la balle sera mis à jour sur le serveur et sur les autres clients du serveur. Le but de cette manipulation est de faire en sorte que le joueur client qui shoot la balle voit instantanément la balle partir dans une autre direction. Tout ceci pour éviter le fait que le client qui shoot la balle notifie le serveur et voit cette balle modifié par le serveur sur sa propre instance de jeu.

Répondre

Revenir vers « (C#) CSharp »