Tuto Space Shooter Comment accéder au score depuis un autre script?

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
refschool
Messages : 11
Inscription : 20 Oct 2018 13:58

Tuto Space Shooter Comment accéder au score depuis un autre script?

Message par refschool » 20 Oct 2018 14:06

bonjour,
j'ai fini de faire le tuto Space Shooter, je voudrais savoir comment on fait pour accéder à la propriété score qui est défini en private dans GameController, depuis par exemple PlayerController. Merci pour votre aide.
Refschool

Avatar de l’utilisateur
Liven
Messages : 268
Inscription : 30 Nov 2017 01:48

Re: Tuto Space Shooter Comment accéder au score depuis un autre script?

Message par Liven » 20 Oct 2018 15:11

Il faut d'abord que tu passe ta variable score en public dans GameController, ensuite dans PlayerController :

Code : Tout sélectionner

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    [SerializeField] private GameController gameController; // attention aux majuscules
    // dans l'inspector, faire glisser l'objet contenant GameController dans ce champs (même si c'est lui même)

    private float scoreRecupere;

    void Start ()
    {
        scoreRecupere = gameController.score;
    }
}
Pour l'histoire des majuscules, c'est juste pour différencier le "type" de variable et le "nom" de la variable. Commencer le nom par une minuscule est quelque chose que tout le monde fait, mais libre à toi de procéder différemment.

Sinon pour être complet, au cas ou tu ne puisse pas glisser l'objet dans le champs (car il n'est pas encore créé dès le début et serra instancié en cours de partie) :

Code : Tout sélectionner

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    private GameObject objetContenantGameController;
    private GameController gameController; 

    private float scoreRecupere;

    void Start ()
    {
        objetContenantGameController = GameObject.Find("NomDeObjetContenantGameController");
        gameController = objetContenantGameController.GetComponent<GameController>();        

        scoreRecupere = gameController.score;
    }
}

Bon mon exemple est un peu bancale car si l'objet cherché n'existe pas en début de partie, tu ne risque pas de le trouve lors du start, mais c'est histoire de montrer le code pour chercher un objet et un composant qu'il contient.

Attention : les fonctions "Find" et "GetComponent" sont très gourmandes donc à utiliser le moins possible (donc à réserver aux start ou awake autant que possible).

Avatar de l’utilisateur
E3DStef
Administrateur
Administrateur
Messages : 1646
Inscription : 14 Juil 2013 18:30
Localisation : https://www.carte-des-membres.com/fr/Unity3D-France/

Re: Tuto Space Shooter Comment accéder au score depuis un autre script?

Message par E3DStef » 20 Oct 2018 20:08

Tu as les variables globales comme expliqué un peu plus haut avec les serializedfields, tu as toujours la solution du fichier txt à la racine ou encore DONTDESTROY ^^

Essaye la solution précédente et dis nous si ok ou pas.

A+

Stef
Le Savoir n'est Précieux que s'il est Partagé

Si besoin urgent de me contacter, faites moi un mail sur : franceunity3d@gmail.com

refschool
Messages : 11
Inscription : 20 Oct 2018 13:58

Re: Tuto Space Shooter Comment accéder au score depuis un autre script?

Message par refschool » 20 Oct 2018 21:06

bonsoir, merci pour ta solution.
Moi j'avais tenté de mettre en public static pour pouvoir y accéder.
J'ai remarqué que je pouvais directement y accéder de cette façon :
int score = GameController.score;
Je ne sais pas si cette façon de faire est "propre", (j'y tiens beaucoup à faire du code propre)
Je vais essayer la solution proposée. En fait tout ce qui est "Serialized" apparait dans l'éditeur n'est ce pas? et de fait rend l'attribut global?
Dernière édition par refschool le 21 Oct 2018 20:53, édité 1 fois.

Avatar de l’utilisateur
Liven
Messages : 268
Inscription : 30 Nov 2017 01:48

Re: Tuto Space Shooter Comment accéder au score depuis un autre script?

Message par Liven » 20 Oct 2018 23:15

refschool a écrit :
20 Oct 2018 21:06
bonsoir, merci pour ta solution.
Moi j'avais tenté de mettre en public static pour pouvoir y accéder.
J'ai remarqué que je pouvais directement y accéder de cette façon :
int score = GameController.score;
Je ne sais pas si cette façon de faire est "propre", (j'y tiens beaucoup à faire du code propre)
Je vis essayer la solution proposée. EN fait tout ce qui est "Serialized" apparit dans l'éditeur n'et ce pas? et de fait rend l'attribut global?
Pour les statics, le soucis c'est qu'à ma connaissance on ne peut y avoir acces dans l'inspector, du coup, au tord ou à raison, je n'ai pas trop l'habitude de les utiliser.

Les exemples que je donne sont surtout fonctionnel, il n'ont pas prétention à être super propre (un peut opti quand même) j'avoue que je suis vite perdu quand on rentre dans les subtilités du langage orienté objet.

[serialised] rend effectivement les variables visible dans l'inspector sans pour autant les rendre public (ces variables restent privé donc interne au script). C'est un bon moyen de les distingué des variables publiques qui elles aussi apparaissent dans l'inspector, mais en plus sont accessible depuis d'autres scripts.
C'est une bonne habitude de distinguer les deux (contrairement à ce que l'on voit dans beaucoup de tutos) pour débugguer, faire la chasse aux variables inutiles et avoir un code propre ;-)

Répondre

Revenir vers « Scripting »