Как получить доступ к переменной из другого скрипта в другом игровом объекте через 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 ()

2 Solutions collect form web for “Как получить доступ к переменной из другого скрипта в другом игровом объекте через GetComponent?”

Вам нужно найти 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?
  • Unity - проверка работоспособности проигрывателя
  • Невозможно изменить цвет GameObject с помощью скрипта?
  • Как подключиться к базе данных Unity
  • Не удалось указать целевые платформы. Проверьте правильность пути sdk android.
  • Как добавить проект распознавания речи в Unity?
  • Использование папки ресурсов в единстве
  • Unity - нужно вернуть значение только после завершения coroutine
  • Доступ к переменным / функциям из другого сценария
  • Как сделать Texture2D доступным для чтения через скрипт
  • Unity - передача данных между сценами
  • Interesting Posts

    PopupMenu с иконками

    Не является ли аргумент шаблона (подпись) части std :: function его типа?

    htaccess переписывает относительные пути

    Как использовать JWT в приложении MVC для аутентификации и авторизации?

    Benchmark Linq2SQL, Subsonic2, Subsonic3 – Какие-нибудь другие идеи, чтобы сделать их быстрее?

    Dropbox и Google Диск одновременно синхронизируют одну и ту же папку, возможно ли это?

    Лицензирование Windows 8 на новых ПК – могу ли я стереть жесткий диск?

    Стандартный формат ответа JSON API?

    Android AutoCompleteTextView с фильтрацией пользовательских адаптеров не работает

    Hibernate, iBatis, Java EE или другой инструмент Java ORM

    Почему Android-приложение аварийно завершает инициализацию переменной с помощью findViewById (R.id. ******) в начале classа?

    Не удалось загрузить тип поставщика Entity Framework?

    Использование android.support.v7.widget.CardView в моем проекте (Eclipse)

    Windows 10 перезапускается при попытке спячки

    Каковы минусы отключения ProxyCreationEnabled для CTP5 кода EF

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