faire que le serveur gère les animations clientes

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
Avatar de l’utilisateur
Eanix
Messages : 62
Inscription : 08 Mai 2015 19:06

faire que le serveur gère les animations clientes

Message par Eanix » 08 Mai 2015 19:13

Bonjour à tous !

Je viens posté un message ici car pendant la création de mon jeu (jeu en 2D : un Zelda multijoueur sur Unity3D en C#), j'ai rencontré un problème qui est le suivant :

Comment faire pour que le serveur qu gère les animations clientes ?

J'ai déjà créer des jeux 2D mais jamais en multijoueur. J'ai chercher pas mal de tutoriel, mais tout ce que j'ai trouver font :

- le client gère ces animations et les envois à tous les autre PC (j'ai testé mais là je rencontre un autre problème étant que l'animation n'est pas fluide :( ).

- le client qui envois des informations à un serveur en ligne (ex : "photon" mais je veux mon propre serveur :D )

Si quelqu'un à de quoi résoudre mon problème, je le remercie d'avance ainsi que tout ce qui ont pris le temps de lire ;)

PS: je ne sais pas si mon sujet est au bon endroit ;)
Un petit pas dans la technologie, un grand fouillis dans ma tête :hehe:

Avatar de l’utilisateur
Orkad
Messages : 24
Inscription : 03 Avr 2015 19:31

Re: faire que le serveur gère les animations clientes

Message par Orkad » 13 Mai 2015 17:22

Salut salut, alors Unity annonce une nouvelle solution pour le Network (on l'attend toujours). Je ne suis pas fan de photon, je trouve que ça bride pas mal au niveau du maximum de joueurs et le ping est assez dégueux, je pense que les gens l'utilisent parce qu'ils n'ont pas que ça a foutre de décortiquer l'API actuelle.

Alors il faut que tu détermine dans un premier temps qui envoie les informations. Le plus souvent chacun des pc connectés envoie les éléments de positionnements de son joueur (position,rotation,scale) et c'est là ou je te conseil de caler l'animation en fonction du mouvement, tu calcule la vitesse des joueurs (que ce soit le tien ou non) et tu envoie le résultat dans l'Animator qui fera tout le reste du boulot. C'est dans le cas UNIQUEMENT d'une animation de mouvement. Si tu as d'autres animations, et j'espère que oui, tu devrais jetter un oeil ici : http://docs.unity3d.com/Manual/net-RPCDetails.html c'est un concept assez dur a assimiler mais c'est vraiment indispensable si tu veux faire un jeu en réseau.

A présent un peu de code qui pourra peut être t'aider :

- Un NetworkBehaviour permettant le même comportement qu'un MonoBehaviour avec un lissage Lerp (Ya mieux) qui te permettra de commencer avec le réseau c'est un peu de la magie :)

Code : Tout sélectionner

using UnityEngine;
using System.Collections;

[RequireComponent(typeof(NetworkView))]
public class NetworkBehaviour : MonoBehaviour {
	public NetworkView nView{get{return GetComponent<NetworkView>();}}
	public NetworkViewID viewID{get{return nView.viewID;}}
	public bool isMine{get{return nView.isMine;}}
	
	private Vector3 networkPosition;
	private Quaternion networkRotation;
	private Vector3 networkScale;
	
	#region Start
	
	protected virtual void BothStart(){}
	protected virtual void OwnerStart(){}
	protected virtual void ViewersStart(){
		networkPosition = transform.position;
		networkRotation = transform.rotation;
		networkScale = transform.localScale;
	}
	
	private void Start(){
		nView.observed = this;
		nView.stateSynchronization = NetworkStateSynchronization.ReliableDeltaCompressed;
		if(nView.isMine)
			OwnerStart();
		else
			ViewersStart();
		BothStart();
	}
	
	#endregion
	
	#region Update
	
	protected virtual void BothUpdate(){}
	protected virtual void OwnerUpdate(){}
	protected virtual void ViewersUpdate(){
		transform.position = Vector3.Lerp(transform.position,networkPosition,Time.deltaTime * 5);
		transform.rotation = Quaternion.Lerp(transform.rotation,networkRotation,Time.deltaTime * 5);
		transform.localScale = networkScale;
	}
	
	private void Update(){
		if(nView.isMine)
			OwnerUpdate();
		else
			ViewersUpdate();
		BothUpdate();
	}
	
	#endregion
	
	private void OnSerializeNetworkView(BitStream stream){
		Vector3 p = transform.position;
		Quaternion r = transform.rotation;
		Vector3 s = transform.localScale;
		if (stream.isWriting){
			stream.Serialize(ref p);
			stream.Serialize(ref r);
			stream.Serialize(ref s);
		}
		else
		{
			stream.Serialize(ref p);
			stream.Serialize(ref r);
			stream.Serialize(ref s);
			networkPosition = p;
			networkRotation = r;
			networkScale = s;
		}
	}
}
Si j'ai mal expliqué ou que tu ne comprend pas quelque chose n'hésite pas à me le dire.

Avatar de l’utilisateur
Eanix
Messages : 62
Inscription : 08 Mai 2015 19:06

Re: faire que le serveur gère les animations clientes

Message par Eanix » 14 Mai 2015 17:16

Je regarde ça et je te dit si cela résous mon problème.

En tout cas tes explication était clair et précise ;)
Un petit pas dans la technologie, un grand fouillis dans ma tête :hehe:

Répondre

Revenir vers « (C#) CSharp »