[Resolu]Photon Jeu Multiplayer avec AI

Questions techniques liées à l’utilisation d'Unity (et n'entrant pas dans le cadre d'une des sections suivantes)
EmileF
Messages : 673
Inscription : 18 Mars 2017 19:39

Re: Photon Jeu Multiplayer avec AI

Message par EmileF » 09 Sep 2018 18:49

Bon ok merci, je vais voir ça.
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

EmileF
Messages : 673
Inscription : 18 Mars 2017 19:39

Re: Photon Jeu Multiplayer avec AI

Message par EmileF » 10 Sep 2018 12:41

Oui, je spawn mon player au moment de la connexion du joueur, mais je ne vois pas comment je peux faire autrement pour affecter ce player à ce joueur.
Je suis débutant dans ce genre et j'avoue que je plane complètement et je n'arrive pas à trouver un tuto qui pourrait me guider.
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

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

Re: Photon Jeu Multiplayer avec AI

Message par Alesk » 10 Sep 2018 13:14

Bon, va falloir mettre en place un lexique commun clair :

- Joueur => l'humain derrière la manette
- IA => Script
- Player => Script/Prefab instancié au moment où un joueur se connecte
- Avatar => GameObject représentant l'avatar 3D dans la scène

Ce sont 4 entités bien distinctes ;)

Imaginons que tu lances une partie avec 4 IA, tu vas donc instancier 4 scripts/prefabs d'IA et 4 prefabs d'avatar.

Dès qu'un joueur va se connecter, tu vas instancier son prefab "Player", mais ce prefab ne doit PAS être le prefab du personnage 3D.
ça doit être un prefab qui ne contient que des scripts.

Donc là, le joueur est connecté, mais on ne lui a pas encore donné la permission de jouer ! Il n'est qu'observateur.
Lorsque tu veux que le joueur puisse prendre le contrôle d'un avatar dans la scène, c'est uniquement à ce moment là que tu dois faire la liaison entre le script du prefab Player et le script d'un avatar (actuellement contrôlé par une IA).

Le script du Player va alors pouvoir envoyer des ordres à l'avatar pour lui indiquer la direction dans laquelle se déplacer ou l'action à effectuer.

J'espère que c'est un peu plus clair comme ça... :gene:

EmileF
Messages : 673
Inscription : 18 Mars 2017 19:39

Re: Photon Jeu Multiplayer avec AI

Message par EmileF » 10 Sep 2018 13:27

Ah ok, merci, je vais essayer de respecter le lexique.

Je vais essayer de mettre en place ce que tu m'as expliqué.

En tout cas je te remercie de l'aide et la patience que tu m'accordes.

Comme je le pensais, c'est pour mettre en relation le player et l'avatar que j'ai des problèmes.

Quand le premier joueur se connecte j'instancie les avatars et le player concernant ce joueur.
Pas de problème jusque là pour associer le player et un des avatars.

Mais quand le 2ème joueur se connecte j'instancie son player, mais je n'arrive pas à mettre en relation un des autres avatars, je n'arrive pas à avoir accès à la liste des avatars crées plus tôt.
Il y a quelque chose que je ne comprends pas.

Voila le code que j'utilise

Code : Tout sélectionner

    void OnJoinedRoom()
    {
        //le nombre de joueurs connectés -1 me donnera l'avatar et le player à sélectionner
        int n = PhotonNetwork.playerList.Length - 1;
        
        //Si c'est le premier joueur qui se connecte
        if (PhotonNetwork.isMasterClient)
        {
            //Instancie les Avatars
            avatars = new List<GameObject>();
            avatars.Add(PhotonNetwork.Instantiate("Prefabs/" + Avatars[0].name, Avatars[0].transform.position, Avatars[0].transform.rotation, 0, null) as GameObject);
            avatars.Add(PhotonNetwork.Instantiate("Prefabs/" + Avatars[1].name, Avatars[1].transform.position, Avatars[1].transform.rotation, 0, null) as GameObject);
            avatars.Add(PhotonNetwork.Instantiate("Prefabs/" + Avatars[2].name, Avatars[2].transform.position, Avatars[2].transform.rotation, 0, null) as GameObject);
            avatars.Add(PhotonNetwork.Instantiate("Prefabs/" + Avatars[3].name, Avatars[3].transform.position, Avatars[3].transform.rotation, 0, null) as GameObject);

            //instancie le premier player
            GameObject player = PhotonNetwork.Instantiate("Prefabs/" + Players[n].name, Vector3.zero, Quaternion.identity, 0) as GameObject;
            //associe le player et l'avatar
            player.GetComponent<Player>().Avatar = avatars[0];
            player.GetComponent<Player>().CommandePC = false;

        }
        else
        {
            //Instancie les autres player au fur et à mesure d'une nouvelle connexion
            GameObject player = PhotonNetwork.Instantiate("Prefabs/" + Players[n].name, Vector3.zero, Quaternion.identity, 0) as GameObject;
            //LA CA COINCE :  LA LISTE DES AVATARS EST NULLE,  PAS D'ASSOCIATION PLAYER/AVATAR POSSIBLE
            //ça me parait normal ils ont été créés sur une autre machine
            //Je n'arrive pas à trouver comment faire pour régler ce problème
            player.GetComponent<Player>().Avatar = avatars[n];
            player.GetComponent<Player>().CommandePC = false;
        }

La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

EmileF
Messages : 673
Inscription : 18 Mars 2017 19:39

Re: Photon Jeu Multiplayer avec AI

Message par EmileF » 11 Sep 2018 13:24

J'ai trouve PunRPC qui, je pense me permet d'avoir accès au avatars. Mais quand je veux affecter l'avatar au player les champs Avatar des scripts Player reste null.
j'avoue que je commence à me lasser de ces heures de recherche et je n'arrive pas à trouver un tuto pouvant m'aider. Heureusement qu'Alesk m'a permis d'avancer d'un pas. Merci à lui.
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

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

Re: Photon Jeu Multiplayer avec AI

Message par Alesk » 11 Sep 2018 14:34

Ta liste "avatars", elle est déclarée où exactement ?

EmileF
Messages : 673
Inscription : 18 Mars 2017 19:39

Re: Photon Jeu Multiplayer avec AI

Message par EmileF » 11 Sep 2018 16:05

"avatars" est déclarée dans le script où il y a la fonction "OnJoinedRoom()".

Mon script à un peu évolué :

Code : Tout sélectionner


    public GameObject[] Avatars;
    public GameObject[] Players;

    internal List<GameObject> avatars;

    void OnJoinedRoom()
    {
        //le nombre de joueurs connectés -1 me donnera l'avatar et le player à sélectionner et 
        int n = PhotonNetwork.playerList.Length - 1;
        if (PhotonNetwork.isMasterClient)
        {
            //Instancie les Avatars
            avatars = new List<GameObject>();
            avatars.Add(PhotonNetwork.Instantiate("Prefabs/" + Avatars[0].name, Avatars[0].transform.position, Avatars[0].transform.rotation, 0, null) as GameObject);
            avatars.Add(PhotonNetwork.Instantiate("Prefabs/" + Avatars[1].name, Avatars[1].transform.position, Avatars[1].transform.rotation, 0, null) as GameObject);
            avatars.Add(PhotonNetwork.Instantiate("Prefabs/" + Avatars[2].name, Avatars[2].transform.position, Avatars[2].transform.rotation, 0, null) as GameObject);
            avatars.Add(PhotonNetwork.Instantiate("Prefabs/" + Avatars[3].name, Avatars[3].transform.position, Avatars[3].transform.rotation, 0, null) as GameObject);

            //instancie le premier player
            GameObject player = PhotonNetwork.Instantiate("Prefabs/" + Players[n].name, Vector3.zero, Quaternion.identity, 0) as GameObject;
            player.GetComponent<Player>()._avatar = avatars[0];


        }
        else
        {
            //Instancie les autres players au fur et à mesure d'une nouvelle connexion
            GameObject player = PhotonNetwork.Instantiate("Prefabs/" + Players[n].name, Vector3.zero, Quaternion.identity, 0) as GameObject;
            PhotonView view = player.GetComponent<PhotonView>();
            view.RPC("AssocieAvatar", PhotonTargets.All, view.viewID, n);
        }
    }

Et dans le script "Player" j'ai:

Code : Tout sélectionner


    public GameObject _avatar;
    
    [PunRPC]
    void AssocieAvatar(int viewid, int index)
    {
        if (PhotonNetwork.isMasterClient)
        {
            //C'est dans NetworkHolder qu'il y a ma liste des "avatars". (ne pas tenir compte de la petite faute dans "NetwordHolder")
            NetworkHolder _networkHolder = GameObject.Find("NetwordHolder").GetComponent<NetworkHolder>();
            GameObject player = PhotonView.Find(viewid).gameObject;
            player.GetComponent<Player>()._avatar = _networkHolder.avatars[index];
        }
    }

J'espère qu'il a évolué dans le bon sens..
Dans cette situation au premier joueur connecté tout va bien, la player commande l'avatar, le champ "_avatar" du script "player" contient "Avatar[0]" comme prévu.
Quand le 2ème joueur se connecte le champ "_avatar" des 2 scripts "player" sont tous les deux nulls.

J'ai essayé je crois toutes les combinaisons de PlayerTargets et j'ai essayé aussi sans "if (PhotonNetwork.isMasterClient)".

Je n'arrive pas à comprendre.
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

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

Re: Photon Jeu Multiplayer avec AI

Message par Alesk » 11 Sep 2018 17:04

Ta liste d'avatars ne semble être mise à jour que du côté du serveur, je pense que ça vient de là.

Essaye une autre approche :

Au lieu d'ajouter les avatars dans la liste globale depuis ton script networkhandler, fait cet ajout depuis l'init du script des avatars.

Ainsi chaque fois que tu spawn un avatar, il s'ajoutera de lui-même à la liste, peu importe que ça se passe sur le serveur ou le client.

Et idem pour un joueur, déclenche l'association à un avatar dans l'init de chaque player, plutôt que dans ton networkhandler.

Pour y accéder plus facilement depuis n'importe quel script, il faudra peut-être que tu fasses des fonctions et des variables statiques dans ta classe networkhandler pour gérer ça.

EmileF
Messages : 673
Inscription : 18 Mars 2017 19:39

Re: Photon Jeu Multiplayer avec AI

Message par EmileF » 12 Sep 2018 16:44

Bon hé bien je suis désolé, je tourne en rond.
Je crains que ça dépasse mes capacités.
A savoir que je suis autodidacte, que je n'ai jamais eu de formation de quelque sorte que ce soit dans ce domaine.
Je crois, et à regret, que je vais abandonner l'idée de créer l'IA pour les player absent.
C'est dommage car quand il n'y a qu'un seul joueur c'est pratiquement sans intérêt.
En tout cas, merci Alesk de l'aide que tu as essayé de m'apporter, et d'autant plus que tu as été le seul.
Encore merci et bonne continuation.
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

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

Re: Photon Jeu Multiplayer avec AI

Message par Alesk » 12 Sep 2018 17:58

Tu vas me faire le plaisir de remonter en selle immédiatement !

Ce n'est pas si compliqué ;)

Un peu de persévérance ! (moi aussi je suis autodidacte... mais j'ai commencé la prog il y a 30 ans :langue3: )

Répondre

Revenir vers « Unity le logiciel »