web-dev-qa-db-fra.com

Accéder à une variable depuis un autre script C #

Pouvez-vous me dire comment accéder à une variable d'un script à partir d'un autre script? J'ai même tout lu sur le site Web de l'unité mais je ne peux toujours pas le faire. Je sais comment accéder à un autre objet mais pas à une autre variable.

Voici la situation: Je suis dans le scriptBet je souhaite accéder à la variable Xà partir du scriptA. La variable Xest booleanname __. Pouvez-vous m'aider?

Btw j’ai besoin de mettre à jour la valeur de Xname __ dans le scriptB, comment puis-je le faire? Accédez-y via la fonction Update Si vous pouviez me donner un exemple avec ces lettres, ce serait génial!

Je vous remercie

7
Lorenzo Spoleti

Vous devez d’abord obtenir le composant de script de la variable, et s’ils se trouvent dans des objets de jeu différents, vous devez passer l’objet de jeu comme référence dans l’inspecteur. 

Par exemple, j'ai scriptA.cs dans GameObject A et scriptB.cs dans GameObject B

scriptA.cs  

// make sure its type is public so you can access it later on
public bool X = false;

scriptB.cs  

public GameObject a; // you will need this if scriptB is in another GameObject
                     // if not, you can omit this
                     // you'll realize in the inspector a field GameObject will appear
                     // assign it just by dragging the game object there
public scriptA script; // this will be the container of the script

void Start(){
    // first you need to get the script component from game object A
    // getComponent can get any components, rigidbody, collider, etc from a game object
    // giving it <scriptA> meaning you want to get a component with type scriptA
    // note that if your script is not from another game object, you don't need "a."
    // script = a.gameObject.getComponent<scriptA>(); <-- this is a bit wrong, thanks to user2320445 for spotting that
    // don't need .gameObject because a itself is already a gameObject
    script = a.getComponent<scriptA>();
}

void Update(){
    // and you can access the variable like this
    // even modifying it works
    script.X = true;
}
14
Jay Kazama

Vous pouvez utiliser statique ici.

voici l'exemple: 

ScriptA.cs

Class ScriptA : MonoBehaviour{
 public static bool X = false;
}

ScriptB.cs

Class ScriptB : MonoBehaviour{
 void Update() {
   bool AccesingX = ScriptA.X;
   // or you can do this also 
   ScriptA.X = true;
 }
}

OR

ScriptA.cs

Class ScriptA : MonoBehaviour{

//you are actually creating instance of this class to access variable.
 public static ScriptA instance;

 void Awake(){

     // give reference to created object.
     instance = this;

 }

 // by this way you can access non-static members also.
 public bool X = false;


}

ScriptB.cs

Class ScriptB : MonoBehaviour{
 void Update() {
   bool AccesingX = ScriptA.instance.X;
   // or you can do this also 
   ScriptA.instance.X = true;
 }
}

pour plus de détails, vous pouvez vous référer à la classe singleton.

1
Kartik Shah

juste pour compléter la première réponse

il n'y a pas besoin de 

a.gameObject.getComponent<scriptA>();

a est déjà un GameObject donc cela fera 

a.getComponent<scriptA>();

et si la variable à laquelle vous essayez d'accéder est chez les enfants de GameObject, vous devez utiliser

a.GetComponentInChildren<scriptA>();

et si vous avez besoin d'une variable ou d'une méthode, vous pouvez y accéder comme ceci

a.GetComponentInChildren<scriptA>().nameofyourvar;
a.GetComponentInChildren<scriptA>().nameofyourmethod(Methodparams);
1
Milad Qasemi