доступ к скрипту другого объекта


Очень часто начинающие в Unity задаются подобным вопросом, поэтому давайте разберём эту тему раз и навсегда.

Когда вы выделяете GameObject, то всё, что находится у него в инспекторе - это компоненты в том числе и ваши собственные скрипты.


Обратиться к компоненту можно с помощью метода  GetComponent<Тип>(). Тип - имя компонента либо вашего класса. 

Например у вас на сцене есть объекты orc и door. Вы хотите чтобы orc обратился к двери и открыл её. У двери есть свойство "открыто/закрыто"

  1. using UnityEngine;
  2.  
  3. public class Door : MonoBehaviour
  4. {
  5.     public bool isOpen = false;
  6. }

Чтобы орк обратился к скрипту двери, то можно поступить разными способами.

Способ 1

Передать орку ссылку на дверь вручную. Для этого создаём у орка свойство, которое будет содержать ссылку на скрипт конкретной двери.

  1. using UnityEngine;
  2.  
  3. public class Orc : MonoBehaviour
  4. {
  5.     public Door someDoor;
  6. }

Теперь в инспекторе орка увидим появившееся поле someDoor в которое перенесём объект(GameObject) door (на котором есть скрипт Door) со сцены. 

dragScriptAnim

И орк может напрямую обратиться к двери и открыть её например.

  1. using UnityEngine;
  2.  
  3. public class Orc : MonoBehaviour
  4. {
  5.     public Door someDoor;
  6.  
  7.     private void Start()
  8.     {
  9.         // орк выбивает дверь ногой
  10.         someDoor.isOpen = true;
  11.     }
  12. }

Способ 2

Орк может самостоятельно найти дверь в мире, перебрав все объекты в сцене и найти дверь по её имени

  1. using UnityEngine;
  2.  
  3. public class Orc : MonoBehaviour
  4. {
  5.     // приватное свойство его уже не видно в инспекторе
  6.     private Door someDoor;
  7.  
  8.     private void Start()
  9.     {
  10.         someDoor = GameObject.Find("door").GetComponent<Door>();
  11.         someDoor.isOpen = true;
  12.     }
  13. }

Но метод Find и подобные ему не рекомендуют часто использовать, например в Update, так как подобные поиски могут нагрузить вашу игру. Поэтому лучше такие операции выполнять либо редко, либо вначале игры. Это касается и вызов GetComponent, поэтому кешируйте свойства, как показано выше.

Способ 3

Орк может поискать дверь не только по имени, но и по скрипту.

  1. someDoor = FindObjectOfType<Door>();

Но в этом случает в someDoor запишется первая попавшаяся дверь на сцене.

Конечно это не все способы поиска нужного объекта. Но для начала этого вам будет достаточно.

Сообщить о нарушении Подробнее