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 :
Pour ce qui est du code, dans le MultiUIManager :
Code : Tout sélectionner
void Start ( )
{
if ( isServer )
{
paw.getPlayer ( );
}
}
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 );
}
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> ( ) );
}
}
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.