Как получить доступ к переменной из другого скрипта в другом gameobject через GetComponent?

Я искал вокруг, и я просто не могу получить эту работу. Я думаю, что просто не знаю правильного синтаксиса или просто не совсем понимаю контекст.

у меня есть сценарий BombDrop, который содержит public int. Я получил это для работы с public static, но кто-то сказал, что это очень плохая привычка программирования и что я должен научиться инкапсуляции. Вот что я написал:--4-->

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);

 }
}

поэтому я хочу сценарий бомбы, который прикрепленный к prefabgameobject Bombprefab для доступа к целому числу maxBombs в BombDrop, так что, когда бомба уничтожена, она добавляет + один к maxBombs в BombDrop.

и это сценарий бомбы, который нуждается в ссылке.

 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);

в документации написано, что это должно быть что-то вроде

BombDropScript = otherGameObject.GetComponent<BombDrop>();

но это не сработает. Может, я просто не понимаю синтаксис. Это, предполагают, чтобы сказать otherGameObject? Потому что это ничего не значит. Я все еще ... получите сообщение об ошибке:" ссылка на объект не задана для экземпляра объекта " в моем BombDropScript.maxBombs вниз в explode ()

2 ответов


вам нужно найти GameObject, который содержит компонент скрипта, на который вы планируете получить ссылку. Убедитесь, что GameObject уже находится в сцене, или Find вернутся null.

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

тогда вы можете захватить сценарий:

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

затем вы можете получить доступ к переменным и функциям скрипта.

 bScript.foo();

Я только что понял, что я ответил на очень похожий вопрос на днях, проверьте здесь: не знаю, как сделать врага здоровье!--16-->


Я немного расширю ваш вопрос, так как я уже ответил на него.

то, что делает ваш код, говорит: "Посмотрите в моем GameObject для BombDropScript, большую часть времени скрипт на тот же объект.

также используйте сеттер и геттер для maxBombs.

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

    public int getMaxBoms()
    {
        return maxBombs;
    }
}

используйте его в start вместо awake и не используйте Destroy(gameObject); вы уничтожаете свой игровой объект, то вы хотите что-то от него

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);
 }

Если вы хотите получить доступ к скрипту в другом gameObject вы должны назначить игровой объект через инспектор и получить доступ к нему так

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