web-dev-qa-db-fra.com

Comment accéder à une variable d'un autre script dans un autre objet de jeu via GetComponent?

J'ai cherché et je n'arrive pas à faire fonctionner ça. Je pense que je ne connais tout simplement pas la syntaxe appropriée, ou ne saisis pas tout à fait le contexte.

J'ai un script BombDrop qui contient un int public. Je l'ai fait fonctionner avec de la statique publique, mais quelqu'un a dit que c'était une très mauvaise habitude de programmation et que je devais apprendre l'encapsulation. Voici ce que j'ai écrit:

script BombDrop:

 <!-- language: c# -->

 public class BombDrop : MonoBehaviour {

 public GameObject BombPrefab;

 //Bombs that the player can drop
 public int maxBombs = 1;


 // Update is called once per frame
 void Update () {

 if (Input.GetKeyDown(KeyCode.Space)){

         if(maxBombs > 0){
         DropBomb();

         //telling in console current bombs
         Debug.Log("maxBombs = " + maxBombs);
         }
   }


 }    

 void DropBomb(){

     // remove one bomb from the current maxBombs
     maxBombs -= 1;

     // spawn bomb prefab
     Vector2 pos = transform.position;
     pos.x = Mathf.Round(pos.x);
     pos.y = Mathf.Round(pos.y);
     Instantiate(BombPrefab, pos, Quaternion.identity);

 }
}

Je veux donc que le script Bomb attaché au prefabgameobject Bombprefab accède à l'entier maxBombs dans BombDrop, de sorte que lorsque la bombe est détruite, il ajoute +1 à maxBombs dans BombDrop.

Et c'est le script Bomb qui a besoin de la référence.

 public class Bomb : MonoBehaviour {
 // Time after which the bomb explodes
 float time = 3.0f;

 // Explosion Prefab
 public GameObject explosion;

 BoxCollider2D collider;

 private BombDrop BombDropScript;




 void Awake (){

     BombDropScript = GetComponent<BombDrop> ();
 }

 void Start () {

     collider = gameObject.GetComponent<BoxCollider2D> ();

     // Call the Explode function after a few seconds
     Invoke("Explode", time);

 }

 void OnTriggerExit2D(Collider2D other){

     collider.isTrigger = false;
 }

 void Explode() {
     // Remove Bomb from game
     Destroy(gameObject);

     // When bomb is destroyed add 1 to the max 
     // number of bombs you can drop simultaneously .
     BombDropScript.maxBombs += 1;

     // Spawn Explosion
     Instantiate(explosion,
                 transform.position,
                 Quaternion.identity);

Dans la documentation, il est dit que cela devrait être quelque chose comme

BombDropScript = otherGameObject.GetComponent<BombDrop>();

Mais ça ne marche pas. Peut-être que je ne comprends tout simplement pas la syntaxe ici. Est-ce supposé dire otherGameObject? Parce que ça ne fait rien. J'obtiens toujours l'erreur: "La référence d'objet non définie fait une instance d'un objet" sur mes BombDropScript.maxBombs dans l'explode ()

13
DoubleCode

Vous devez trouver le GameObject qui contient le composant de script auquel vous prévoyez d'obtenir une référence. Assurez-vous que le GameObject est déjà dans la scène, ou Find renverra null.

 GameObject g = GameObject.Find("GameObject Name");

Ensuite, vous pouvez saisir le script:

 BombDrop bScript = g.GetComponent<BombDrop>();

Ensuite, vous pouvez accéder aux variables et fonctions du script.

 bScript.foo();

Je viens de réaliser que j'ai répondu à une question très similaire l'autre jour, vérifiez ici: Je ne sais pas comment obtenir la santé de l'ennemi


Je vais développer un peu votre question car j'ai déjà répondu.

Ce que fait votre code, c'est "Cherchez dans mon GameObject un BombDropScript, la plupart du temps le script ne sera pas attaché au même GameObject.

Utilisez également un setter et un getter pour maxBombs.

public class BombDrop : MonoBehaviour
{
    public void setMaxBombs(int amount)
    {
        maxBombs += amount;
    }

    public int getMaxBoms()
    {
        return maxBombs;
    }
}
23
FunctionR

utilisez-le au début au lieu de réveillé et n'utilisez pas Destroy(gameObject); vous détruisez votre objet de jeu alors vous en voulez quelque chose

void Start () {
     BombDropScript =gameObject.GetComponent<BombDrop> ();
     collider = gameObject.GetComponent<BoxCollider2D> ();

     // Call the Explode function after a few seconds
     Invoke("Explode", time);

 }

void Explode() {
//..
  //..
//at last
Destroy(gameObject);
 }

si vous voulez accéder à un script dans un autre gameObject, vous devez assigner l'objet de jeu via l'inspecteur et y accéder comme ça

 public gameObject another;
void Start () {
     BombDropScript =another.GetComponent<BombDrop> ();
}
2
Milad Qasemi