[RS] Problème avec ClientRpc (Unet) [résolu]

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
Warcza
Messages : 160
Inscription : 18 Fév 2016 20:49

[RS] Problème avec ClientRpc (Unet) [résolu]

Message par Warcza » 15 Sep 2017 19:16

Bonjour,

Je rencontre un petit problème de synchro sur une certaine fonction en "ClientRpc" qui ne veut pas s'effectuer du coté client.

Pour résumer le déroulement du code, dans la scène multi pré-enregistrer dans le networkManager j'ai un objet qui contient le script "MultiUIManager" ou sa fonction start ne sera utiliser que par le serveur et qui permettra de récupérer tous les joueurs dans la scène.
Dans la fonction de récupération à certains moments des fonctions RpcClient seront appelées, mais le problème c'est que ces fonctions RpcClients ne sont pas appelées coté client et je comprend pas pourquoi .

J'ai fais un ptit schéma au cas ou si mon explication est foireuse :
Image

Pour ce qui est du code, dans le MultiUIManager :

Code : Tout sélectionner

void Start ( )
	{
		if ( isServer )
		{
			paw.getPlayer ( );
		}
	}
Coté PawControlMulti dans la fonction de récup :

Code : Tout sélectionner

[Server]
	public void getPlayer ( )
	{
		nbrPlay.Clear ( );

		List<PlayerMulti> getP = allPlayer;
		List<int> getNbrP = nbrPlay;

		int nbrPlayer = 0;

		foreach ( PlayerMulti thisPlayer in FindObjectsOfType<PlayerMulti> ( ) )
		{
			getP.Add ( thisPlayer );
			getP [ nbrPlayer ].IdPlayer = nbrPlayer;
			getP [ nbrPlayer ].CanDetect = false;
			getP [ nbrPlayer ].CanPlay = false;

			getNbrP.Add ( 0 );
			
			RpcIniPlayer ( thisPlayer.gameObject, nbrPlayer ); // 

			nbrPlayer ++;
		}

		// Si il manque des joueurs
		if ( nbrPlayer < Prototype.NetworkLobby.LobbyManager.s_Singleton.numPlayers )
		{
			getP.Clear ( );
			getNbrP.Clear ( );
			canOpen = false;
			
			RpcClearNbrP ( );
			
			StartCoroutine ( waitRecheck ( ) );
			return;
		}

		Debug.Log ( "server in PawMulti" );

		RpcPassPlayer ( nbrPlayer );
	}
et les trois fonctions RpcClient

Code : Tout sélectionner

[ClientRpc]
	void RpcIniPlayer ( GameObject thisPlayer, int thisID )
	{
		PlayerMulti thisP = thisPlayer.GetComponent <PlayerMulti> ( );
		allPlayer.Add ( thisP );
		nbrPlay.Add ( 0 );

		thisP.IdPlayer = thisID;
		thisP.CanDetect = false;
		thisP.CanPlay = false;
	}

	[ClientRpc]
	void RpcClearNbrP ( )
	{
		allPlayer.Clear ( );
		nbrPlay.Clear ( );
	}

	[ClientRpc]
	void RpcPassPlayer ( int nbrPlayer )
	{
		Debug.Log ( "Client in PawMulti" );
		List<Image> setPass = passPlayer;

		Vector2 rectParent = getPassInfo.GetComponent<RectTransform> ( ).sizeDelta;
		Vector2 thisRect;

		GameObject getCurrImg;

		float getSpace = ( float ) ( rectParent.x - PassPrefb.GetComponent<RectTransform> ( ).sizeDelta.x * nbrPlayer ) / ( nbrPlayer - 1 );
		int a;

		for ( a = 0; a < nbrPlayer; a++ )
		{
			getCurrImg = ( GameObject ) Instantiate ( PassPrefb, getPassInfo );
			thisRect = getCurrImg.GetComponent<RectTransform> ( ).sizeDelta;
			getCurrImg.GetComponent<Transform> ( ).localPosition = new Vector2 ( -rectParent.x / 2 + thisRect.x / 2 + a * thisRect.x + getSpace * a, rectParent.y / 2 - thisRect.y / 2 );

			getCurrImg.GetComponent<Image> ( ).sprite = StopPass;
			setPass.Add ( getCurrImg.GetComponent<Image> ( ) );
		}
	}
Du coup aucune de ses trois fonctions RpcClients ne veulent marcher, alors que celles utilisés dans le script joueurs marchent.
Je sais pas si c'est du au fais que le client ne s'initialise pas à temps ? mais ça me semblerait bizarre vue que j'arrive à récupérer tous les joueurs dans ma variable List (et y a une vérification si il manque des joueurs).
Et j'espère que c'est pas du au fait que l'objet soit présent par défaut dans la scène multi, ça serait un peut abusé.

Enfin voila, si quelques à une piste ça m'aiderais grandement ;p
Merci.
Dernière édition par Warcza le 19 Sep 2017 00:16, édité 3 fois.
(╯°□°)╯︵ ┻━┻

Warcza
Messages : 160
Inscription : 18 Fév 2016 20:49

Re: [RS] Problème avec ClientRpc (Unet)

Message par Warcza » 16 Sep 2017 22:05

En cherchant j'ai trouvé ça :
https://issuetracker.unity3d.com/issues ... ne-objects

De ce que j'ai compris [ClientRpc] ne marchait pas pour les clients en local, est-ce que quelqu'un sait si c'est toujours le cas ? (mes tests se font en local)

J'ai aussi deux questions, hiérarchiquement entre objet parents et enfants, peut-on avoir plusieurs Network Identity ?
La deuxième concerne les channels (pour command / clientRpc, etc), faut-il forcement que je l'ai utilise, ou je peux m'en passer?

Il y a également une erreur que je viens d'apercevoir, c'est l'instanciation d'un observer du coté de MultiUiManager et sur l'un des joueurs, il en manque un, et dans la console j'ai cette erreur :
NullReferenceExecption: Object reference not set to an instance of an object Unity.GeneratedNetworkCode._WriteModeToken_None
Mais ce qui est bizarre c'est que pour pawControlMulti, je n'ai pas ce problème d'observer, ils sont tous la.
Du coup si quelqu'un à une idée sur ça, je suis preneur
(╯°□°)╯︵ ┻━┻

Warcza
Messages : 160
Inscription : 18 Fév 2016 20:49

Re: [RS] Problème avec ClientRpc (Unet)

Message par Warcza » 17 Sep 2017 14:37

Pour l'erreur d'instanciation, j'ai trouver le problème qui était du au [syncvar] que j'avais placé sur des types de variables un peu spécial.

Du coup maintenant y a plus d'erreur dans le console log, et mon seul problème restant, c'est celui avec les RpcClients dont je n'ai pas encore trouvé le problème.

Voila voila, toujours preneurs pour des pistes de solutions ;s

Edit : alors, je sais pas trop pourquoi, mais tout marche maintenant (j'ai rien touché mdr).
Du coup je met le sujet en résolu pour l'instant

Edit edit ( mdr ) : ouai, bon enfaite un coup la fonction RpcClients marche, et parfois non, donc si quelqu'un à une idée sur ça je suis preneur, je chercherais de mon coté un peu plus tard.

merci
(╯°□°)╯︵ ┻━┻

Warcza
Messages : 160
Inscription : 18 Fév 2016 20:49

Re: [RS] Problème avec ClientRpc (Unet)

Message par Warcza » 19 Sep 2017 00:16

Bon, j'ai finalement trouvé le pourquoi du comment et la solution.

Pour si ça peut aider en gros le problème du pourquoi les clients ne recevaient pas les fonction ClientRpc étaient du à :

- L'observeur du client n'était pas initialisé assez vite (du coup pour ça j'ai fais une condition et une fonction IEnumérator qui compare le nombre d'observeur au nombre de joueur qui doit être présent dans la scène multi avec le networkManager).
- Et du au fait que que quand j'utilise directement unity comme host, ça ne marchait pas également (surement du à un problème de par-feu, j'ai pas chercher à résoudre ça). Du coup deux builds peuvent communiquer entre eux sans problème et si un build host, unity peut se connecter dessus et recevoir les fonctions Rpc.
(╯°□°)╯︵ ┻━┻

Répondre

Revenir vers « (C#) CSharp »