Page 1 sur 1

les nouveaux clients voient les objets supprimés

Publié : 10 Juin 2017 16:54
par thyma
Salut salut après 6mois d’absence je me suis remis sur mon fps
Et je bloc sur un bug qui est la depuis le début mais je me suis dit quand je m'en occuperai à la fin. Et la et ban j'y suis arrivé puisque c'est le tout dernier bug (bon ok des que je rajouterai des trucs notamment un system de login avec bsd et inventaire :mdr1: ça vas recommencer) bon le bug le voici : les nouveaux clients voient tous les gameobjects qui ont été supprimés pendant la partie et sa fait beaucoup puisqu'à chaque fois que tu respawn tu supprime l'ancien personnage pour réapparaitre avec le nouveau (vu que c'est un fps classe) et a chaque fois qu'une balle est tiré elle doit bien disparaitre à un moment pour éviter les lags bref quand un nouveau joueur se connecte à une partie en cours c'est Tchernobyl puisqu'il voit tous les morts et toutes les balles depuis le début de la partie (et en plus ça veut dire aussi que le serveur stock tout ça ce qui est pas génial) pourtant j'utilise bien la fonction Network.Destroy j'avais compris que ça évitait justement ce bug par rapport à la fonction Destroy

je sait pas si je suis bien clair si vous voulez le code ou plus d’explication je vous le passe

Re: les nouveaux clients voient les objets supprimés

Publié : 10 Juin 2017 17:45
par Max
Bonjour,
thyma a écrit : si vous voulez le code ...
ben dans la section script, cela aurait du sens, et pis cela peut en effet aider oui :mrgreen:

Re: les nouveaux clients voient les objets supprimés

Publié : 11 Juin 2017 10:51
par thyma
Bon alors voila le script qui gère les pv (et les morts par manque de pv)

Code : Tout sélectionner

var vie = 10;

function Update (){
	if ( GetComponent.<NetworkView>().isMine){
		if (vie <= 0){
			Network.Destroy(this.gameObject);
   		}
	}
}

function OnTriggerEnter (col : Collider){
		if(col.tag == "1"){
			vie -= 1;
	   	}
		if(col.tag == "2"){
			vie -= 2;
	    }
	    if(col.tag == "3"){
			vie -= 3;
	   	}
	    if(col.tag == "4"){
			vie -= 4;
	   	}
}
et la c'est la partie du script menu qui gère le respawnage (ça se dit ?)

Code : Tout sélectionner

if (spawner == true){
			GUI.Box(new Rect(Screen.width/6, Screen.height/4, Screen.width/1.5, Screen.height/2), "apparaitre");
			if(rouge == false){
				if(GUI.Button(Rect(Screen.width/5.8, Screen.height/3.5 ,Screen.width/8 ,Screen.height/10), "équipe rouge")){
					rouge = !rouge;
					bleu = false;
				}
			}
			if (bleu == false){
				if(GUI.Button(Rect(Screen.width/5.8, Screen.height/1.6 ,Screen.width/8 ,Screen.height/10), "équipe bleu")){
					bleu = !bleu;
					rouge = false;
				}
			}
			if(bleu == true){
				if(GUI.Button(Rect(Screen.width/5.8, Screen.height/1.6 ,Screen.width/8 ,Screen.height/10), "classe 6")){
				}
				if(GUI.Button(Rect(Screen.width/3.3, Screen.height/1.6 ,Screen.width/8 ,Screen.height/10), "classe 7")){
				}
				if(GUI.Button(Rect(Screen.width/2.3, Screen.height/1.6 ,Screen.width/8 ,Screen.height/10), "classe 8")){
				}
				if(GUI.Button(Rect(Screen.width/1.76, Screen.height/1.6 ,Screen.width/8 ,Screen.height/10), "classe 9")){
				}
				if(GUI.Button(Rect(Screen.width/1.43, Screen.height/1.6 ,Screen.width/8 ,Screen.height/10), "classe 10")){
				}
			}
			if(rouge == true){
				if(GUI.Button(Rect(Screen.width/5.8, Screen.height/3.5 ,Screen.width/8 ,Screen.height/10), "classe 1")){
					Network.Destroy(joueur);
					joueur = Network.Instantiate(classe1, spawnRouge.transform.position, spawnRouge.transform.rotation, 0);
					joueur.name = pseudo;
					menu = false;
				}
				if(GUI.Button(Rect(Screen.width/3.3, Screen.height/3.5 ,Screen.width/8 ,Screen.height/10), "classe 2")){
					Network.Destroy(joueur);
					joueur = Network.Instantiate(classe2, spawnRouge.transform.position, spawnRouge.transform.rotation, 0);
					joueur.name = pseudo;
					menu = false;
				}
				if(GUI.Button(Rect(Screen.width/2.3, Screen.height/3.5 ,Screen.width/8 ,Screen.height/10), "classe 3")){
					Network.Destroy(joueur);
					joueur = Network.Instantiate(classe3, spawnRouge.transform.position, spawnRouge.transform.rotation, 0);
					joueur.name = pseudo;
					menu = false;
				}
				if(GUI.Button(Rect(Screen.width/1.76, Screen.height/3.5 ,Screen.width/8 ,Screen.height/10), "classe 4")){
					Network.Destroy(joueur);
					joueur = Network.Instantiate(classe4, spawnRouge.transform.position, spawnRouge.transform.rotation, 0);
					joueur.name = pseudo;
					menu = false;
				}
				if(GUI.Button(Rect(Screen.width/1.43, Screen.height/3.5 ,Screen.width/8 ,Screen.height/10), "classe 5")){
					Network.Destroy(joueur);
					joueur = Network.Instantiate(classe5, spawnRouge.transform.position, spawnRouge.transform.rotation, 0);
					joueur.name = pseudo;
					menu = false;
				}
			}
		}
et aussi un autre problème (je sait que sait pas lié mais c'est un peu dans le même sujet) comment on fait pour que quand des joeurs se déconnectent leur perso soit supprimés automatiquement de la partie?

Re: les nouveaux clients voient les objets supprimés

Publié : 12 Juin 2017 10:17
par evereal
Hello,

En effet, si le Network.destroy est appelé ailleurs que sur le serveur, le buffer n'est pas vidé.
Voici une solution pour contourner le problème.
Tu vas devoir l'adapter pour ton code mais le but est de remplacer tes appels a Network.Destroy par la fonction DestroyGO.

Code : Tout sélectionner

     void DestroyGO(){
         RemoveBufferedInstantiate (this.networkView.viewID);
         Network.Destroy (this.gameObject);
     }
     
     [RPC]
     void RemoveBufferedInstantiate (NetworkViewID viewID) {
         if (Network.isServer) {
             Network.RemoveRPCs (viewID);
         } else {
             networkView.RPC ("RemoveBufferedInstantiate", RPCMode.Server, viewID);
         }
     }

Re: les nouveaux clients voient les objets supprimés

Publié : 13 Juin 2017 21:09
par thyma
salut (désolé pour le temps de réponse)
si j'ai bien compris ta réponse en plus de supprimer le gameObject avec un network.destroy il faut vider le bufer et ça doit se faire depuis le serveur
du coup j'ai modifier mon code
la ligne Network.Destroy(this.gameObject
je l'ai modifier par GetComponent.<NetworkView>().RPC("mort", RPCMode.Server, this.GetComponent.<NetworkView>().viewID);

et à la fin j'ai rajouter ça:

Code : Tout sélectionner

@RPC function mort(a : NetworkViewID){
 	if (Network.isServer) {
		Network.RemoveRPCs (a);
		var view : NetworkView = NetworkView.Find(a);
		view.name = "a";
		var toDestroy = GameObject.Find("a");
		Network.Destroy(toDestroy);
	}
}
mais le bug n'est pas réglé et en plus çe rajoute d'autres bugs
je ne comprend pas vraiment
j'ai pas être mal expliqué mon problème, c'est exactement pareil que celui-ci : viewtopic.php?f=88&t=13279

Re: les nouveaux clients voient les objets supprimés

Publié : 18 Juin 2017 14:56
par thyma
up ? Je n'ai toujours pas trouver la solution

Network.RemoveRPCs (viewID); ne semble pas marcher pour vider le buffer (ou alors vider le buffer ne semble pas marcher pour corriger ce bug^^)

Re: les nouveaux clients voient les objets supprimés

Publié : 30 Juin 2017 14:34
par thyma
j'ai résolu l'erreur
tu a raison il fallait rajouter le Network.RemoveRPCs(player);
sauf que la variable player ne doit pas être un network view id
mais la variable network.Player