[CF-RS] Override NetworkLobbyManager capricieux

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
Ke20
Messages : 2
Inscription : 24 Juil 2017 11:14

[CF-RS] Override NetworkLobbyManager capricieux

Message par Ke20 » 24 Juil 2017 14:09

Bonjour tout le monde!

Sans plus de présentation, j'aimerais vous soumettre le problème qui me pousse à m'inscrire sur ce forum! Ca me travaille depuis quelques jours et je ne dirais pas non à un avis externe.

Tout d'abord, je souhaite préciser que je viens du monde Java et que mon travail sur Unity n'est qu'un hobby. Veuillez donc considérer toutes les réponses de noob qui vous viennent à l'esprit sans trop faire attention à la classification de ce message.

Voilà mon problème :

J'ai un CustomNetworkLobbyManager qui étend le NetworkLobbyManager.

Code : Tout sélectionner

CustomNetworkLobbyManager : NetworkLobbyManager
Dans mon implémentation, je souhaite surcharger la méthode OnServerAddPlayer.
Pour voir le code originel de cette méthode, je me base sur ce lien :
https://bitbucket.org/Unity-Technol...a ... ew-default

Serais-ce peut-être ma première erreur? J'ai bien l'impression que c'est le repo officiel, mais peut-être en existe t'il un autre?

Normalement, à la fin de cette méthode, un nouveau LobbyPlayer est créé et ajouté au tableau des NetworkLobbyPlayer.
Je veux ensuite écrire un code basé sur ce nouveau joueur nouvellement ajouté au tableau.

J'écris donc :
public override void OnServerAddPlayer(NetworkConnection conn, short playerControllerId) {

base.OnServerAddPlayer(conn, playerControllerId);

// Debug seulement présent pour faciliter l'inspection de l'instance du tableau via le mode debug de visual studio.
// A noter que la longueur du tableau de variera pas
Debug.Log(lobbySlots.Length);

// Code personnel ici
}
Quand je lance mon serveur avec ce code et que "j'espionne" l'instance du tableau après l'appel à la fonction parente ("base") : toutes les valeurs du tableau sont à null.

Si je diffère mon appel d'une milliseconde via la méthode "Invoke", une cellule de mon tableau est correctement remplie avec ma nouvelle instance de joueur.

Et si je choisi de ne pas appeler la fonction parente mais de plutôt recopier intégralité de son code dans ma propre fonction :
tout fonctionne parfaitement : une cellule de mon tableau est là encore correctement remplie avec ma nouvelle instance de joueur.

Ma question est donc la suivante : pourquoi? Que fais-je donc de mal? Ais-je une bonne utilisation du mot-clef "base" en C#?
J'ai l'impression que la réponse est vraiment stupide. Mais étant donné que certains comportement réseaux sont parfois quelque peu étonnant sous Unity; mon esprit a tendance à chercher des réponses plus complexes.

Merci beaucoup si par avance quelqu'un a le courage de me lire! ;)

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

Re: [CF-RS] Override NetworkLobbyManager capricieux

Message par evereal » 25 Juil 2017 09:12

Hello,

Ton code est correcte en tout cas.
Comme tu le dis, le comportement réseau est parfois étrange sur unity et il y a déjà eu bcq de problème avec la classe NetworkLobbyManager.
Il faudrait peut être vérifier ta pile d'appel. Dans la doc il est précisé que la fonction est appelée quand un client utilise la méthode ClientScene.AddPlayer. Il y a surement une suite logique a respecter.
“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 !”

Répondre

Revenir vers « (C#) CSharp »