[MY-RS] Synchroniser le changement de Parent

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
Zhass
Messages : 30
Inscription : 21 Avr 2017 12:40

[MY-RS] Synchroniser le changement de Parent

Message par Zhass » 05 Mai 2017 19:47

Bonjour tout le monde,

Donc je suis en train de développer un jeu multijoueur Médiéval. J'aimerais que les joueurs puissent avoir la possibilité de ranger leur épée dans le fourreau ou la sortir quand ils le souhaitent.

Du coup j'ai crée dans le prefab du model du joueur, deux Empty GameObject. Un est enfant de la jambe gauche (pour suivre ses mouvements) qui représente le fourreau, et un autre enfant de la main droite pour la position de l'épée dans la main.

Donc j'ai deux fonctions, Hand() et Scabbard() (fourreau en Anglais). Lorsque le joueur spawn, l'épée est bien évidemment dans le fourreau donc la fonction Scabbard est appelée immédiatement. (vous pouvez regarder ce que font ces fonctions dans mon code).
Et quand le joueur clique sur le bouton gauche de la sourie, il déclenche (par intermédiaire d'une variable de type bool) la fonction Hand(). Et inversement si le joueur appuis sur R. (L'épée devient enfant des empty).

Seulement, tout fonctionne parfaitement en local. L'épée change bien de position (Du fourreau à la main et l'inverse) mais dans le réseau rien ne se vois, les autres joueurs voient l'épée du joueur concerné toujours dans le fourreau et pour lui, son épée est dans la main.

Du coup j'ai essayé de mettre un Photon View à l'épée avec un smooth Movement. Tout fonctionne bien, les autres joueurs voient l'épée dans la main donc parfait, mais l'épée ne suit pas parfaitement sont parent (l'empty concerné) et donc quand le joueur cours, son épée est loin derrière alors qu'il l'a tient dans la main... :D

Bref, j'ai essayé pas mal de chose, appel RPC, smooth movement, transform sync, photon view... Mais je sèche.

Voici mon code bien foireux :D

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MeleeFight : MonoBehaviour {
    
    Animator Animation;
    PhotonView View;

    public GameObject MeleeWeapon;
    public Transform ScabbardPosition;
    public Transform HandPosition;

    public bool inScabbard = true;
    public bool inHand = false;
	
	void Start () {
        Animation = GetComponent<Animator>();
        View = GetComponent<PhotonView>();
        inScabbard = true; //Set the weapon in Scabbard
	}
	
	
	void Update () {
        //Check Status
        if (inScabbard) //Weapon in Scabbard
        {
            View.RPC("Scabbard", PhotonTargets.All);
            if (Input.GetMouseButtonDown(0)) //To Hand
            {
                if (View.isMine)
                {
                    Animation.SetBool("Armed", true);
                    inScabbard = false;
                    inHand = true;
                }
            }
        }

        if (inHand) //Weapon in Hand
        {
            View.RPC("Hand", PhotonTargets.All);
            if (Input.GetKeyDown(KeyCode.R)) //To Scabbard
            {
                if (View.isMine)
                {
                    Animation.SetBool("Armed", false);
                    inHand = false;
                    inScabbard = true;
                }
            }
        }

        
	}

    [PunRPC] void Scabbard() //Weapon in Scabbard
    {
        if (View.isMine)
        {
            MeleeWeapon.transform.position = ScabbardPosition.position;
            MeleeWeapon.transform.rotation = ScabbardPosition.rotation;
            MeleeWeapon.transform.SetParent(ScabbardPosition);
        }
    }


    [PunRPC] void Hand() //Weapon in Hand
    {
        if (View.isMine)
        {
            MeleeWeapon.transform.position = HandPosition.position;
            MeleeWeapon.transform.rotation = HandPosition.rotation;
            MeleeWeapon.transform.SetParent(HandPosition);
        }
    }
}


Je vous remercie d'avance, j'espère que quelqu'un va pouvoir m'aider :)
Bon weekend :D
while (!success)
{
retry();
}

http://meonweb.esy.es/MeOnWeb/

alexr1221
Messages : 35
Inscription : 21 Avr 2016 16:21

Re: [PUN] Synchroniser le changement de Parent

Message par alexr1221 » 06 Mai 2017 11:07

Salut,
C'est bien un RPC qu'il faut utiliser. Ça ne marche pas car tu as mis if (photonview.isMine). Ton RPC doit surement être envoyé mais puisque ce photonView appartient à toi et pas aux autres, le bout de code qui est dans le compartiment photonView.isMine va s'executer seulement pour toi.

Avatar de l’utilisateur
Zhass
Messages : 30
Inscription : 21 Avr 2017 12:40

Re: [PUN] Synchroniser le changement de Parent

Message par Zhass » 06 Mai 2017 13:06

Bonjour,

Merci pour ton aide, du coup j'ai supprimé les if(View.isMine) dans les RPC Hand et Scabbard. Mais le problème est toujours la, j'ai aussi essayé de mettre les inHand = true, inScabbard = false hors des view.isMine mais du coup l'épée se met dans la main de tous les joueurs ^^

Je vois pas trop comment faire maintenant car les appels RPC m'ont l'air de fonctionner (merci à toi :D ) mais par contre je peux pas mettre les variables bool hors des conditions view.isMine car sinon tous les joueurs prennent leurs épées dans les mains :) Et si je l'ai met à l'intérieur, sa ne fonctionne pas :D C'est le serpent qui se mort la queue ^^

Du coup mon code ressemble à ça :

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MeleeFight : MonoBehaviour {
    
    Animator Animation;
    PhotonView View;

    public GameObject MeleeWeapon;
    public Transform ScabbardPosition;
    public Transform HandPosition;

    public bool inScabbard = true;
    public bool inHand = false;
	
	void Start () {
        Animation = GetComponent<Animator>();
        View = GetComponent<PhotonView>();
        inScabbard = true; //Set the weapon in Scabbard
	}
	
	
	void Update () {
        //Check Status
        if (inScabbard) //Weapon in Scabbard
        {
            View.RPC("Scabbard", PhotonTargets.All);
            
            if (Input.GetMouseButtonDown(0)) //To Hand
            {
                if (View.isMine)
                {
                    Animation.SetBool("Armed", true);
                    inScabbard = false;
                    inHand = true;
                }
               
            }
        }

        if (inHand) //Weapon in Hand
        {
            View.RPC("Hand", PhotonTargets.All);
            
            if (Input.GetKeyDown(KeyCode.R)) //To Scabbard
            {
                if (View.isMine)
                {
                    Animation.SetBool("Armed", false);
                    inHand = false;
                    inScabbard = true;
                }
             
            }
        }

        
	}

    [PunRPC] void Scabbard() //Weapon in Scabbard
    {
            MeleeWeapon.transform.position = ScabbardPosition.position;
            MeleeWeapon.transform.rotation = ScabbardPosition.rotation;
            MeleeWeapon.transform.SetParent(ScabbardPosition);
    }


    [PunRPC] void Hand() //Weapon in Hand
    {
            MeleeWeapon.transform.position = HandPosition.position;
            MeleeWeapon.transform.rotation = HandPosition.rotation;
            MeleeWeapon.transform.SetParent(HandPosition);
    }
}
while (!success)
{
retry();
}

http://meonweb.esy.es/MeOnWeb/

alexr1221
Messages : 35
Inscription : 21 Avr 2016 16:21

Re: [PUN] Synchroniser le changement de Parent

Message par alexr1221 » 06 Mai 2017 16:23

Déjà il faudrait que tu mettes en place un systeme qui fait que ça n'envoie qu'un seul message à chaque fois que l'état de l'épée change. Là tu envoies des messages en permanence. Ensuite pour le problème, si tu as un script pour chaque personnage et que ce sont des clients différents, je ne sais pas.

Avatar de l’utilisateur
Zhass
Messages : 30
Inscription : 21 Avr 2017 12:40

Re: [PUN] Synchroniser le changement de Parent

Message par Zhass » 06 Mai 2017 16:44

Ouais c'est vrai parce que ça se sent au niveau du réseau, il y a plus de lags :)

Je vais continuer à essayer des trucs ^^ mais merci pour ton aide :)
while (!success)
{
retry();
}

http://meonweb.esy.es/MeOnWeb/

Répondre

Revenir vers « (C#) CSharp »