I found solutions. It works. I think it is very dirty, but it works so I am happy 
Here is my spawnscript code (feel free to correct or reuse that, I reused myself a lot of the networking example and also of this : http://forum.unity3d.com/threads/24721-Tutorial-Unity-and-PHP-login-script-simple-but-useful), I didn’t changed much the other scripts. (I comment in French, I know it is not right, but it helps me see what are my comments and what are the original comments
and also it is my mother tongue
I’ll be glad to translate, though )
//prefab à instancier pour générer le personnage joueur
private var playerPrefab : GameObject;
// Local player information when one is instantiated
private var localPlayer : NetworkPlayer;
private var localTransformViewID : NetworkViewID;
private var localAnimationViewID : NetworkViewID;
private var localidbdd : int=0;
private var isInstantiated : boolean = false;
private var isIdentified : boolean = false;
// The server uses this to track all instantiated player
private var playerInfo : Array = new Array();
//identification BDD
private var login = "";
private var formPassword = ""; //mot de passe perso des cliens
private var textrect : Rect = Rect(0, 150, 200, 20); //just make a GUI object rectangle
private var messErreurConnex ="";
private var formText = ""; //variable pour stocker les messages de php
private var scriptConnexion = "http://127.0.0.1/testReseau/connexion.php"; //script php permettant de se connecter
private var hash = "liv3"; //code secret d'accès à la BDD, si modifié, modifier aussi dans le script php
private var idBDDtemp : int;
//choix du personnage à instantier à partir de la bdd
private var scriptGetNumPerso = "http://127.0.0.1/testReseau/getNumPerso.php"; //script php permettant de se connecter
private var num_personnage : int = 0;
private var tableau_perso : Array = new Array("truc","NetworkPersonPlayer","Cube","Elise");//liste des personnages en fonction de leur position dans la BDD
//classe qui sert à stocker les infos des joueurs sur le serveur, essentiellement utile pour les détruire quand ils déco
class PlayerInfo {
var transformViewID : NetworkViewID;
var animationViewID : NetworkViewID;
var player : NetworkPlayer;
var idBDD : int;
}
function OnGUI ()
{
if (Network.isClient localPlayer.ToString() != 0 !isInstantiated)
{
if (isIdentified)
{
if (GUI.Button(new Rect(20,Screen.height-60, 90, 20),"SpawnPlayer"))
{
// Spawn the player on all machines
networkView.RPC("SpawnPlayer", RPCMode.AllBuffered, localPlayer, localTransformViewID, localAnimationViewID,localidbdd);
isInstantiated = true;
}
}
else
{
login = GUILayout.TextField(login, GUILayout.MinWidth(100));
formPassword = GUILayout.PasswordField(formPassword,"*"[0], GUILayout.MinWidth(100));
GUI.TextArea( textrect, messErreurConnex );
GUILayout.BeginVertical();
if (GUILayout.Button ("Se Connecter"))
{
if(login!="")
{
Login(localPlayer);
}
else
{
messErreurConnex="Vous n'avez pas indiqué d'identifiant";
}
}
GUILayout.EndVertical();
}
}
}
// Create a networked player in the game. Instantiate a local copy of the player, set the view IDs
// accordingly.
@RPC
function SpawnPlayer (playerIdentifier : NetworkPlayer, transformViewID : NetworkViewID, animationViewID : NetworkViewID, idbdd : int)
{
var instantiatedPlayer : GameObject ;
var networkViews;
networkView.RPC("GetNumPerso", RPCMode.AllBuffered, localidbdd);
yield WaitForSeconds (1);
var nom_prefab : String = "";
nom_prefab = tableau_perso[num_personnage] as String;
playerPrefab = Resources.Load(nom_prefab, GameObject);
instantiatedPlayer = Instantiate(playerPrefab, transform.position, transform.rotation);
networkViews = instantiatedPlayer.GetComponents(NetworkView);
// Assign view IDs to player object
if (networkViews.Length != 2) {
Debug.Log("Error while spawning player, prefab should have 2 network views, has "+networkViews.Length);
return;
} else {
networkViews[0].viewID = transformViewID;
networkViews[1].viewID = animationViewID;
}
// Initialize local player
if (playerIdentifier == localPlayer)
{
Debug.Log("Enabling user input as this is the local player");
// W are doing client prediction and thus enable the controller script + user input processing
instantiatedPlayer.GetComponent(ThirdPersonController).enabled = true;
instantiatedPlayer.GetComponent(ThirdPersonController).getUserInput = true;
// Enable input network synchronization (server gets input)
instantiatedPlayer.GetComponent(NetworkController).enabled = true;
instantiatedPlayer.SendMessage("SetOwnership");
instantiatedPlayer.SendMessage("SetPersoActuel",localidbdd);//pas utile, il suffit que localidbdd soit publique
return;
// Initialize player on server
}
else if (Network.isServer)
{
instantiatedPlayer.GetComponent(ThirdPersonController).enabled = true;
instantiatedPlayer.GetComponent(PersonAnimation).enabled = true;
// Record player info so he can be destroyed properly
var playerInstance : PlayerInfo = new PlayerInfo();
playerInstance.transformViewID = transformViewID;
playerInstance.animationViewID = animationViewID;
playerInstance.player = playerIdentifier;
playerInstance.idBDD=localidbdd;
playerInfo.Add(playerInstance);
//networkView.RPC("MajPlayer", playerIdentifier, localidbdd);
}
}
@RPC
function Login(localPlayer : NetworkPlayer)
{
var form = new WWWForm(); //nouveau formulaire
form.AddField( "myform_hash", hash );
form.AddField( "myform_nick", login );
form.AddField( "myform_pass", formPassword );
var requete = WWW(scriptConnexion, form); //creation de la requete que va envoyer unity à php (qui lui va se connecter a mysql)
yield requete; //yield return en c#
if (requete.error != null)
{
Debug.Log(requete.error); //if there is an error, tell us
}
else
{
formText = requete.text; //here we return the data our PHP told us
requete.Dispose(); //clear our form in game
if(formText!=""&formText!="passno"&formText!="loginno")
{
idBDDtemp = int.Parse(formText);
localidbdd=0;
networkView.RPC("MajPlayer", RPCMode.AllBuffered, idBDDtemp);
isIdentified=true;
}
else if(formText=="passno")
{
messErreurConnex = "Mauvais mot de passe";
}
else if(formText=="loginno")
{
messErreurConnex = "Utilisateur inconnu";
}
}
login = ""; //just clean our variables
formPassword = "";
}
@RPC
function MajPlayer (idbdd : int) {
if (Network.isServer)
{
localidbdd = idbdd;
}
else
{
if (localidbdd == 0)
{
localidbdd = idbdd;
}
}
}
@RPC
function GetNumPerso(id : int)
{
Debug.Log("fonction GetNumPerso");
var form = new WWWForm(); //nouveau formulaire
form.AddField( "myform_hash", hash );
var idstr = id.ToString();
form.AddField( "myform_id", idstr );
var requete = WWW(scriptGetNumPerso, form); //creation de la requete que va envoyer unity à php (qui lui va se connecter a mysql)
yield requete; //yield return en c#
if (requete.error != null)
{
Debug.Log(requete.error); //if there is an error, tell us
}
else
{
formText = requete.text; //here we return the data our PHP told us
requete.Dispose(); //clear our form in game
if(formText!="")
{
var numPerso : int = int.Parse(formText);
Debug.Log("on est dans GetNumPerso et on va lancer MajNumPerso");
networkView.RPC("MajNumPerso", RPCMode.AllBuffered, numPerso);//pose soucis parce que du coup on écrase les infos chez tous les clients
}
}
idstr = ""; //just clean our variables
id = 0;
}
@RPC
function MajNumPerso(i : int)
{
if (Network.isServer)
{
num_personnage =i;
Debug.Log("serveur : fonction MajNumPerso");
}
else
{
num_personnage =i;
Debug.Log("client : fonction MajNumPerso");
}
}
// Receive server initialization, record own identifier as seen by the server.
// This is later used to recognize if a network spawned player is the local player.
// Also record assigned view IDs so the server can synch the player correctly.
@RPC
function InitPlayer (player : NetworkPlayer, tViewID : NetworkViewID, aViewID : NetworkViewID) {
Debug.Log("Received player init "+ player +". ViewIDs " + tViewID + " and " + aViewID);
localPlayer = player;
localTransformViewID = tViewID;
localAnimationViewID = aViewID;
}
// Send initalization info to the new player, before that he cannot spawn himself
function OnPlayerConnected (player : NetworkPlayer) {
Debug.Log("Sending player init to "+player);
var transformViewID : NetworkViewID = Network.AllocateViewID();
var animationViewID : NetworkViewID = Network.AllocateViewID();
Debug.Log("Player given view IDs "+ transformViewID + " and " + animationViewID);
networkView.RPC("InitPlayer", player, player, transformViewID, animationViewID);
}
function OnPlayerDisconnected (player : NetworkPlayer) {
Debug.Log("Cleaning up player " + player);
// Destroy the player object this network player spawned
var deletePlayer : PlayerInfo;
for (var playerInstance : PlayerInfo in playerInfo) {
if (player == playerInstance.player) {
Debug.Log("Destroying objects belonging to view ID " + playerInstance.transformViewID);
Network.Destroy(playerInstance.transformViewID);
deletePlayer = playerInstance;
}
}
playerInfo.Remove(deletePlayer);
Network.RemoveRPCs(player, 0);
Network.DestroyPlayerObjects(player);
}