Multiplayer & setactive

Questions techniques liées à l’utilisation d'Unity (et n'entrant pas dans le cadre d'une des sections suivantes)
lemniscate
Messages : 30
Inscription : 24 Fév 2016 13:34

Multiplayer & setactive

Message par lemniscate » 29 Fév 2016 17:10

Bonjour à tous!



Lorsqu'un joueur est seul dans mon jeu, pas de problèmes, il se balade de decor en decor toujours en restant dans la même "scene" (telles qu'elles sont nommées dans unity). Lorsqu'il arrive a l'ectremité du decor, le jeu va lui même chercher dans la bdd mysql les infos du decor suivant et remplace le decor actuel. Le joueur est donc techniquement toujours dans la même "scene" mais avec l'illusion d'avoir avancé (le decor a changé).

Sauf que si il y a un deuxieme joueur qui se situe au centre de la scène par exemple, et qu'avec mon propre joueur je touche l'extremité du decor, un nouveau decor va bien se charger pour moi, mais le deuxieme joueur sera toujours là, au centre de la scene et donc au centre du nouveau decor! Vu depuis l'ecran du deuxieme joueur pas de changements, pour lui il est bien toujours sur le premier decor.

Mon idée dans la théorie c'est qu'à chaque nouveau chargement de decor, aller tester la base de données afin de rechercher tous les joueurs presents dans le decor ou je suis actuellement et supprimer (avec setactive par exemple) tous les autres joueurs. Mais ca reste de la théorie que jusqu'ici je n'ai pas reussi a mettre en place, que ce soit avec !islocalplayer, RPC, [command] et autre syncvar... :nono:

Si vous avez besoin d'infos supplementaires n'hesitez pas a demander et si vous avez une idée, même théorique (sans forcement un detail en c#) je suis preneur! Comme vous vous en doutez surement, celui qui trouvera la solution gagnera la benediction des dieux.

:merci:
les codeurs C#, rattrapez les!

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6222
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Multiplayer & setactive

Message par boubouk50 » 29 Fév 2016 17:26

lemniscate a écrit :Sauf que si il y a un deuxieme joueur qui se situe au centre de la scène par exemple, et qu'avec mon propre joueur je touche l'extremité du decor, un nouveau decor va bien se charger pour moi, mais le deuxieme joueur sera toujours là, au centre de la scene et donc au centre du nouveau decor! Vu depuis l'ecran du deuxieme joueur pas de changements, pour lui il est bien toujours sur le premier decor.
Salut,

Je ne suis pas sur d'avoir compris cette partie. "L'erreur" se situe au niveau du premier joueur qui "voit" le second joueur alors qu'il ne devrait pas c'est bien ça? Pour le second joueur, il n'y a pas de problème? (un joueur quitte le décor, donc il devrait également disparaître non?)

De ce que j'ai compris, il faudrait que tu affiches/calcules seulement les joueurs présents sur la même case que toi en somme? Ça semble pas trop compliqué à mettre en place, il me semble, une propriété par joueur que tu viens vérifier à chaque changement de décor pour chaque joueur. Du coup, je me pose la question de savoir si j'ai bien compris.
La mise en place et l'efficacité dépend également du nombre de joueurs.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

lemniscate
Messages : 30
Inscription : 24 Fév 2016 13:34

Re: Multiplayer & setactive

Message par lemniscate » 29 Fév 2016 17:35

Je pense que tu as bien compris.

Il n'y a qu'une scène. 4 extremité nord/sud/est/ouest. Lorsque mon joueur A touche le bord est, il est téléporté au bord ouest et le décor change, donc illusion du changement de scène. Sauf qu'on est toujours dans la meme scène et donc tous les autres joueurs restent plantés là. Le but c'est de faire disparaitre ceux dont le position X et Y (de la zone ou ils sont par rapport au monde du jeu et non de leur component transform bien entendu) ne correspond pas à celle du joueur joué.

Chaque changment de decor engendre un "!islocalplayer / me.setactive(false)" qui permet deja d'effacer tout le monde sauf le joueur joué, ensuite faudrait que j'aille rechercher les joueurs situés dans le même decor pour les activer, mais comment? :) oui j'ai une base de données ou chaque joueur est enregistré via un login, eventuellement ca peut servir puisque la position XY du decor de chaque joueur y est repertorié. Mais je n'arrive pas a trouver la bonne formule.
les codeurs C#, rattrapez les!

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6222
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Multiplayer & setactive

Message par boubouk50 » 29 Fév 2016 17:49

Donc les positions des joueurs ne permettent pas de localiser sur quelle map le joueur se situe. Tu dois bien avoir un élément de ta table qui indique sur quelle carte est le personnage, non? Pour les respawn on bon endroit. C'est cela qu'il te faudrait utiliser. Faire une requête globale sur les joueurs. C'est lourd comme ça, y'a surement moyen d'alléger la requête.
Sinon, il te faudrait avoir un tableau globale des "positions" des joueurs, tu afficherais seulement ceux qui sont sur la même case de tableau que toi. je m'exprime. Si ta carte est définie par 4 côtés, elle se résume à un tableau de tableau: carte [x][y]. Ton tableau est géré par les coordonnées de ta map (par ex: carte [4][6] la 4e à l'est et la 6e au sud, avec l'origine le Nord-Ouest), cette case contiendrait donc la clé unique des joueurs présents que tu peux récupérer à tout moment et qui te permettrait de savoir qui afficher.
La mise à jour des cases se ferait au moment d'un changement -> actualiser la position du tableau -> actualiser les joueurs sur l'ancienne et la nouvelle case.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

lemniscate
Messages : 30
Inscription : 24 Fév 2016 13:34

Re: Multiplayer & setactive

Message par lemniscate » 29 Fév 2016 18:01

Oui voila, c'est pour ca que j'ai dans la base de donnée de chaque joueur une valeur intitulée positionX et une positionY qui permet de savoir ou ils sont. J'ai tous les éléments, c'est ca le pire, ils se mettent a jour dans la base de donnée chaque fois qu'un joueur change de zone etc... mais je n'arrive pas à trouver les mots dans mon code pour aller rechercher ces infos et les transmettre a chaque joueur. Je peux aller cherche les infos du joueur que je joue ca je sais comment l'ecrire mais je ne sais pas comment ecrire "quels sont les joueurs dont les valeurs positionX et positionY sont les meme que les miennes/ setactive(true) pour ces joueurs trouvés" bref l'echange entre les joueurs de leur informations quoi. Je suis sure que je peux régler mon problème en 3 lignes de code. Quelque chose avec command, ou RPC
les codeurs C#, rattrapez les!

lemniscate
Messages : 30
Inscription : 24 Fév 2016 13:34

Re: Multiplayer & setactive

Message par lemniscate » 29 Fév 2016 18:06

Code : Tout sélectionner

if (isLocalPlayer) {

			Debug.Log (sceneController.positionPlayerString);
			myPoZone = sceneController.positionPlayerString;//il trouve le string indiquant ma position (par rapport a la carte du monde) "X;Y"
			TransmitPosition ();
				
		}
		else if (!isLocalPlayer)  {
			if (SyncPozone != sceneController.positionPlayerString) {
				me.SetActive (false);//desactive le joueur n'ayant pas la meme position

			} 
		}


	[Command]
	void CmdSendMyZonePositionToTheServer(string poZone)
	{
		SyncPozone = poZone;
	}

	void TransmitPosition()
	{
		CmdSendMyZonePositionToTheServer (myPoZone);
	}
les codeurs C#, rattrapez les!

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6222
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Multiplayer & setactive

Message par boubouk50 » 29 Fév 2016 18:08

Ok. Les commandes réseaux me sont inconnues. Les requêtes SQL pas mieux. Là, va falloir attendre un membre plus calé que moi...
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Avatar de l’utilisateur
Alesk
Messages : 2303
Inscription : 13 Mars 2012 09:09
Localisation : Bordeaux - France
Contact :

Re: Multiplayer & setactive

Message par Alesk » 29 Fév 2016 18:22

Salut,

Je ne suis pas certain que ça soit une bonne idée de passer par une BDD pour ce genre d'opération... Mais admettons...
Lorsqu'un joueur se trouve dans une scène (ou en change), tu dois stocker les coordonnées de cette scène dans la classe du joueur, ainsi tu n'auras qu'à faire une boucle sur tous les joueurs présents pour comparer leurs coordonnées et ne garder que celles correspondant à la scène en cours d'affichage.

lemniscate
Messages : 30
Inscription : 24 Fév 2016 13:34

Re: Multiplayer & setactive

Message par lemniscate » 29 Fév 2016 18:31

Je pense avoir une piste, en desactivant tous les autres joueurs a chaque changement de zone puis en allant via php dresser une liste des joueurs presents dans la meme zone, ceci en creant une methode while dans le C# du style while ((!isLocalPlayer)&&(nomTrouvé == nom1))---> me.setActive(true); etc pour chaque nom trouvés correspondant a la même zone. Je vais tester. Il activera normalement un par un les joueurs qu'il aura trouvé. Par contre si il y a beaucoup de joueurs inscrits au jeu cette methode risque d'etre longue je pense et invoquée très régulièrement :/
reste plus qu'a espérer que personne ne joue a mon jeu comme ca il sera fluide
les codeurs C#, rattrapez les!

lemniscate
Messages : 30
Inscription : 24 Fév 2016 13:34

Re: Multiplayer & setactive

Message par lemniscate » 29 Fév 2016 18:34

Salut Alesk, ouais j'y avais pensé mais aussitot j'ai oublié ca car ca suppose que le joueur stocke une donnée sensible sur son ordinateur.
les codeurs C#, rattrapez les!

Répondre

Revenir vers « Unity le logiciel »