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

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

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

Сценарий BombDrop:

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

Поэтому я хочу, чтобы сценарий Bomb, прикрепленный к prefabgameobject Bombprefab, получил доступ к целому числу maxBombs в BombDrop, так что, когда бомба уничтожена, она добавляет +1 к 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 (); } void Start () { collider = gameObject.GetComponent (); // 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(); 

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

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

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

Затем вы можете схватить скрипт:

  BombDrop bScript = g.GetComponent(); 

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

  bScript.foo(); 

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


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

Что делает ваш код, так это: «Посмотрите в мой GameObject для BombDropScript , большую часть времени сценарий не будет прикреплен к тому же GameObject.

Также используйте setter и getter для maxBombs .

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

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

 void Start () { BombDropScript =gameObject.GetComponent (); collider = gameObject.GetComponent (); // 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 (); } 
  • Unity EventManager с делегатом вместо UnityEvent
  • Как заставить сценарий ждать / спать простым способом в единстве
  • Как обнаружить события click / touch в пользовательском интерфейсе и GameObjects
  • Чтение и запись файла на streamingAssetsPath
  • Затухание в / из GameObject
  • Масштабирование GUI.TextArea с размером экрана
  • Простая система событий в Unity
  • Используйте функцию динамического ключевого слова / .NET 4.6 в Unity
  • Скопируйте файлы из ресурсов / StreamingAssets в Application.persistentDataPath после установки
  • Unity3D UI, вычисление позиции перетаскивания элемента?
  • Unity load medias из папки и отображения на RawImage
  • Interesting Posts

    Можете ли вы разбить / разбить поле в запросе MySQL?

    Есть ли способ восстановить предыдущую версию в Mac OS X после установки обновления?

    Секторов и кластеров

    Как я могу наилучшим образом угадать кодировку, когда спецификация (знак байтового заказа) отсутствует?

    сортировка списка карт

    Фоновый оттенок Lollipop не влияет на кнопку

    Получение ошибки при использовании ng-controllerа в angularjs ver 1.3.0

    Как изменить CLASSPATH в Java?

    Что такое VGA, и в чем разница между ним и видеокартой?

    Каков наиболее эффективный алгоритм для поиска прямой линии, проходящей через большинство точек?

    Как отправить объекты через комплект

    Получить результаты из хранимой процедуры oracleа

    Получить сгенерированный идентификатор после вставки

    В Windows (и ПК), какой инструмент восстановления разделов является хорошим, надежным?

    Почему гость VirtualBox не может подключиться к сети?

    Давайте будем гением компьютера.