Как обратиться к объекту в unity

от admin

Управление игровыми объектами (GameObjects) с помощью компонентов

В редакторе Unity вы изменяете свойства Компонента используя окно Inspector. Так, например, изменения позиции компонента Transform приведет к изменению позиции игрового объекта. Аналогично, вы можете изменить цвет материала компонента Renderer или массу твёрдого тела (RigidBody) с соответствующим влиянием на отображение или поведение игрового объекта. По большей части скрипты также изменяют свойства компонентов для управления игровыми объектами. Разница, однако, в том, что скрипт может изменять значение свойства постепенно со временем или по получению ввода от пользователя. За счет изменения, создания и уничтожения объектов в заданное время может быть реализован любой игровой процесс.

Обращение к компонентам

Наиболее простым и распространенным является случай, когда скрипту необходимо обратиться к другим компонентам, присоединенных к тому же GameObject. Как упоминалось во разделе Введение, компонент на самом деле является экземпляром класса, так что первым шагом будет получение ссылки на экземпляр компонента, с которым вы хотите работать. Это делается с помощью функции GetComponent. Типично, объект компонента сохраняют в переменную, это делается в C# посредством следующего синтаксиса:

В UnityScript синтаксис немного отличается:

Как только у вас есть ссылка на экземпляр компонента, вы можете устанавливать значения его свойств, тех же, которые вы можете изменить в окне Inspector:

Дополнительная возможность, недоступная в окне Inspector — вызов функций экземпляра компонента:

Имейте ввиду, что нет причины, по которой вы не можете иметь больше одного пользовательского скрипта, присоединенного к одному и тому же объекту. Если вам нужно обратиться к одному скрипту из другого, вы можете использовать, как обычно, GetComponent, используя при этом имя класса скрипта (или имя файла), чтобы указать какой тип Компонента вам нужен.

Если вы попытаетесь извлечь Компонент, который не был добавлен к Игровому Объекту, тогда GetComponent вернет null; возникнет ошибка пустой ссылки при выполнении (null reference error at runtime), если вы попытаетесь изменить какие-либо значения у пустого объекта.

Обращение к другим объектам

Пусть иногда они и существуют изолированно, все же, обычно, скрипты отслеживают другие объекты. Например, преследующий враг должен знать позицию игрока. Unity предоставляет несколько путей получения других объектов, каждый подходит для конкретной ситуации.

Связывание объектов через переменные

Самый простой способ найти нужный игровой объект — добавить в скрипт переменную типа GameObject с уровнем доступа public:

Переменная будет видна в окне Inspector, как и любые другие:

Теперь вы можете перетащить объект со сцены или из панели Hierarchy в эту переменную, чтобы назначить его. Функция GetComponent и доступ к переменным компонента доступны как для этого объекта, так и для других, то есть вы можете использовать следующий код:

Кроме того, если объявить переменную с доступом public и заданным типом компонента в вашем скрипте, вы сможете перетащить любой объект, который содержит присоединенный компонент такого типа. Это позволит обращаться к компоненту напрямую, а не через игровой объект.

Соединение объектов через переменные наиболее полезно, когда вы имеете дело с отдельными объектами, имеющими постоянную связь. Вы можете использовать массив для хранения связи с несколькими объектами одного типа, но связи все равно должны быть заданы в редакторе Unity, а не во время выполнения. Часто удобно находить объекты во время выполнения, и Unity предоставляет два основных способа сделать это, описанных ниже.

Нахождение дочерних объектов

Иногда игровая сцена может использовать несколько объектов одного типа, таких как враги, путевые точки и препятствия. Может возникнуть необходимость отслеживания их в определенном скрипте, который управляет или реагирует на них (например, все путевые точки могут потребоваться для скрипта поиска пути). Можно использовать переменные для связывания этих объектов, но это сделает процесс проектирования утомительным, если каждую новую путевую точку нужно будет перетащить в переменную в скрипте. Аналогично, при удалении путевой точки придется удалять ссылку на отсутствующий объект. В случаях, наподобие этого, чаще всего удобно управлять набором объектов, сделав их дочерними одного родительского объекта. Дочерние объекты могут быть получены, используя компонент Transform родителя (так как все игровые объекты неявно содержат Transform):

Вы можете также найти заданный дочерний объект по имени, используя функцию Transform.Find:

Это может быть полезно, когда объект содержит дочерний элемент, который может быть добавлен или удален в игровом процессе. Хороший пример — оружие, которое может быть подобрано и выброшено.

Controlling GameObjects using components

In the Unity Editor, you make changes to Component properties using the Inspector. So, for example, changes to the position values of the Transform Component will result in a change to the GameObject’s position. Similarly, you can change the color of a Renderer’s material or the mass of a Rigidbody with a corresponding effect on the appearance or behavior of the GameObject. For the most part, scripting is also about modifying Component properties to manipulate GameObjects. The difference, though, is that a script can vary a property’s value gradually over time or in response to input from the user. By changing, creating and destroying objects at the right time, any kind of gameplay can be implemented.

Accessing components

Наиболее простым и распространенным является случай, когда скрипту необходимо обратиться к другим компонентам, присоединенных к тому же GameObject. Как упоминалось во разделе Введение, компонент на самом деле является экземпляром класса, так что первым шагом будет получение ссылки на экземпляр компонента, с которым вы хотите работать. Это делается с помощью функции GetComponent. Типично, объект компонента сохраняют в переменную, это делается в C# посредством следующего синтаксиса:

Как только у вас есть ссылка на экземпляр компонента, вы можете устанавливать значения его свойств, тех же, которые вы можете изменить в окне Inspector:

Дополнительная возможность, недоступная в окне Inspector — вызов функций экземпляра компонента:

Имейте ввиду, что нет причины, по которой вы не можете иметь больше одного пользовательского скрипта, присоединенного к одному и тому же объекту. Если вам нужно обратиться к одному скрипту из другого, вы можете использовать, как обычно, GetComponent, используя при этом имя класса скрипта (или имя файла), чтобы указать какой тип Компонента вам нужен.

Если вы попытаетесь извлечь Компонент, который не был добавлен к Игровому Объекту, тогда GetComponent вернет null; возникнет ошибка пустой ссылки при выполнении (null reference error at runtime), если вы попытаетесь изменить какие-либо значения у пустого объекта.

Accessing other objects

Пусть иногда они и существуют изолированно, все же, обычно, скрипты отслеживают другие объекты. Например, преследующий враг должен знать позицию игрока. Unity предоставляет несколько путей получения других объектов, каждый подходит для конкретной ситуации.

Linking GameObjects with variables

Самый простой способ найти нужный игровой объект — добавить в скрипт переменную типа GameObject с уровнем доступа public:

Переменная будет видна в окне Inspector, как и любые другие:

Теперь вы можете перетащить объект со сцены или из панели Hierarchy в эту переменную, чтобы назначить его. Функция GetComponent и доступ к переменным компонента доступны как для этого объекта, так и для других, то есть вы можете использовать следующий код:

Additionally, if you declare a public variable of a Component type in your script, you can drag any GameObject that has that Component attached onto it. This accesses the Component directly rather than the GameObject itself.

Соединение объектов через переменные наиболее полезно, когда вы имеете дело с отдельными объектами, имеющими постоянную связь. Вы можете использовать массив для хранения связи с несколькими объектами одного типа, но связи все равно должны быть заданы в редакторе Unity, а не во время выполнения. Часто удобно находить объекты во время выполнения, и Unity предоставляет два основных способа сделать это, описанных ниже.

Finding child GameObjects

Sometimes, a game Scene makes use of a number of GameObjects of the same type, such as enemies, waypoints and obstacles. These may need to be tracked by a particular script that supervises or reacts to them (for example, all waypoints might need to be available to a pathfinding script). Using variables to link these GameObjects is a possibility but it makes the design process tedious if each new waypoint has to be dragged to a variable on a script. Likewise, if a waypoint is deleted, then it is a nuisance to have to remove the variable reference to the missing GameObject. In cases like this, it is often better to manage a set of GameObjects by making them all children of one parent GameObject. The child GameObjects can be retrieved using the parent’s Transform component (because all GameObjects implicitly have a Transform):

Вы можете также найти заданный дочерний объект по имени, используя функцию Transform.Find: transform.Find(«Gun»);

Это может быть полезно, когда объект содержит дочерний элемент, который может быть добавлен или удален в игровом процессе. Хороший пример — оружие, которое может быть подобрано и выброшено.

Важные классы — GameObject

Класс Unity GameObject используется для представления всего, что может существовать в Сцене Сцена содержит окружение и меню вашей игры. Думайте о каждом уникальном файле сцены как об уникальном уровне. В каждой сцене вы размещаете свое окружение, препятствия и декорации, по сути проектируя и создавая свою игру по частям. Подробнее
См. в Словарь
.

Эта страница относится к скриптам с классом GameObject Unity. Чтобы узнать об использовании игровых объектов в сцене и иерархии в редакторе Unity, см. раздел GameObjects руководства пользователя. Исчерпывающую информацию о каждом члене класса GameObject см. в справочнике по сценариям GameObject.

GameObjects — это стандартные блоки для сцен в Unity, которые служат контейнером для функциональных компонентов, определяющих, как выглядит GameObject и что делает GameObject.

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

Свойства статуса сцены

С помощью скрипта можно изменить ряд свойств, которые относятся к статусу игрового объекта в сцене. Обычно они соответствуют элементам управления, видимым в верхней части инспектора окна Unity, в котором отображается информация о текущем выбранном игровом объекте, активе или настройки проекта, позволяющие просматривать и редактировать значения. Дополнительная информация
См. в Словарь , когда в редакторе выбран GameObject.

Они не относятся к какому-либо конкретному компоненту и отображаются в инспекторе GameObject вверху над списком компонентов.

Типичный GameObject, просматриваемый в Инспекторе. В данном случае направленный свет. Свойства состояния сцены обведены красным.Типичный GameObject, просматриваемый в Инспекторе. В данном случае направленный свет. Свойства состояния сцены обведены красным.

Все игровые объекты имеют общий набор элементов управления в верхней части инспектора, относящихся к статусу игрового объекта в сцене, и ими можно управлять с помощью API сценариев игрового объекта.

Если вам нужен краткий список всех доступных API для класса GameObject, см. Справочник по скриптам GameObject.

Активный статус

Активный статус GameObjectАктивный статус GameObject

Игровые объекты активны по умолчанию, но их можно деактивировать, что приведет к отключению всех компонентов, прикрепленных к игровым объектам. Обычно это означает, что он станет невидимым и не будет получать какие-либо обычные обратные вызовы или события, такие как Update или FixedUpdate .

Читать:
Как включить виртуальный привод

Статус игрового объекта активен представлен флажком слева от имени игрового объекта. Вы можете управлять этим с помощью GameObject.SetActive .

Вы также можете прочитать текущее активное состояние с помощью GameObject.activeSelf , а также не GameObject действительно активен в сцене с использованием GameObject.activeInHierarchy . Последнее из этих двух необходимо, потому что действительно ли GameObject активен, определяется его собственным активным состоянием плюс активным состоянием всех его родителей. Если какой-либо из его родителей неактивен, он не будет активен, несмотря на его собственную активную настройку.

Статический статус

Статический статус GameObjectСтатический статус GameObject

Некоторые системы Unity, такие как Global Illumination группа методов, которые моделируют как прямое, так и непрямое освещение для обеспечения реалистичного освещения. полученные результаты. В Unity есть две системы глобального освещения, сочетающие прямое и непрямое освещение: запеченное глобальное освещение и глобальное освещение в реальном времени.
См. в Словарь , Окклюзия, Пакетная обработка, Навигация и Reflection Probes Компонент рендеринга, который захватывает сферическое изображение своего окружения во всех направлениях, подобно камере. Захваченное изображение затем сохраняется как кубическая карта, которую можно использовать для объектов с отражающими материалами. Подробнее
См. в Словарь , полагайтесь на статический статус GameObject. Вы можете указать, какие из систем Unity будут считать GameObject статическими, используя GameObjectUtility.SetStaticEditorFlags . Узнайте больше о статических игровых объектах здесь.

Теги и слои

Статический статус GameObjectСтатический статус GameObject

Теги обеспечивают способ маркировки и идентификации типов игровых объектов в вашей сцене, а слои обеспечивают аналогичный, но отличный способ включения или исключения групп игровых объектов из определенных встроенных элементов. в действиях, таких как рендеринг процесс вывода графики на экран ( или к текстуре рендера). По умолчанию основная камера в Unity отображает изображение на экране. Подробнее
См. Словарь или физические коллизии.

Дополнительную информацию об использовании тегов и слоев в редакторе см. на основных страницах руководства пользователя для тегов. Опорное слово, которое вы можете присвоить одному или нескольким игровым объектам, чтобы помочь вам идентифицировать игровые объекты для сценариев. Например, вы можете определить тег «Съедобный» для любого предмета, который игрок может съесть в вашей игре. Подробнее
См. в Словарь и Слои Слои в Unity можно использовать для выборочного включения или исключения групп игровых объектов из определенных процессов или вычислений. Это включает в себя рендеринг камеры, освещение, физические коллизии или пользовательские вычисления в вашем собственном коде. Подробнее
См. в Словарь .

Вы можете изменить значения тегов и слоев с помощью скрипта, используя GameObject.tag и GameObject.layer . Вы также можете эффективно проверить тег GameObject с помощью метода CompareTag , который включает проверку того, тег существует и не вызывает выделения памяти.

Добавление и удаление компонентов

Вы можете добавлять или удалять компоненты во время выполнения, что может быть полезно для процедурного создания игровых объектов или изменения поведения игрового объекта. Обратите внимание, что вы также можете включить или отключить компоненты скрипта и некоторые типы встроенных компонентов через скрипт без их уничтожения.

Лучший способ добавить компонент во время выполнения — использовать AddComponent , указав тип компонента в угловых скобках, как показано. Чтобы удалить компонент, вы должны использовать метод Object.Destroy для самого компонента.

Доступ к компонентам

Самый простой случай — когда скрипту игрового объекта требуется доступ к другому компоненту, прикрепленному к тому же игровому объекту (помните, что другие скрипты, прикрепленные к игровому объекту, также сами являются компонентами). Для этого первым делом необходимо получить ссылку на экземпляр компонента, с которым вы хотите работать. Это делается с помощью метода GetComponent. Как правило, вы хотите присвоить объект Component переменной, что делается с помощью следующего кода. В этом примере скрипт получает ссылку на Rigidbody компонент, который позволяет моделируемой гравитации и другим силам воздействовать на GameObject. . Подробнее
См. в компоненте Словарь на том же GameObject:

Once you have a reference to a Component instance, you can set the values of its properties much as you would in the Inspector:

Вы также можете вызывать методы для ссылки на компонент, например:

Примечание: у вас может быть несколько пользовательских скриптов фрагмент кода, который позволяет создавать собственные компоненты, запускающие игровые события , изменяйте свойства компонента с течением времени и реагируйте на ввод данных пользователем любым удобным для вас способом. Подробнее
См. Словарь , прикрепленный к тому же GameObject. Если вам нужно получить доступ к одному скрипту из другого, вы можете использовать GetComponent как обычно и просто использовать имя класса скрипта (или имя файла), чтобы указать нужный тип компонента.

Если вы попытаетесь получить тип компонента, который на самом деле не был добавлен в GameObject, GetComponent вернет значение null; вы получите ошибку нулевой ссылки во время выполнения, если попытаетесь изменить какие-либо значения нулевого объекта.

Доступ к компонентам других игровых объектов

Хотя иногда они работают изолированно, сценарии обычно отслеживают другие игровые объекты или, чаще, компоненты других игровых объектов. Например, в кулинарной игре повару может понадобиться знать положение плиты. Unity предоставляет несколько различных способов извлечения других объектов, каждый из которых подходит для определенных ситуаций.

Связывание с игровыми объектами с помощью переменных в инспекторе

Самый простой способ найти связанный GameObject — добавить в скрипт общедоступную переменную GameObject:

Эта переменная будет видна в Инспекторе как поле GameObject.

Теперь вы можете перетащить объект со сцены или панели иерархии на эту переменную, чтобы назначить ее.

Перетаскивание префаба из окна проекта в поле GameObject в окне инспектораПеретаскивание префаба из окна проекта в поле GameObject в окне инспектора

Функция GetComponent и переменные доступа к компоненту доступны для этого объекта, как и для любого другого, поэтому вы можете использовать следующий код:

Кроме того, если вы объявите общедоступную переменную типа Компонент в своем скрипте, вы сможете перетащить любой GameObject, к которому прикреплен этот Компонент. Это напрямую обращается к компоненту, а не к самому игровому объекту.

public Transform playerTransform;

Связывание объектов вместе с переменными наиболее полезно, когда вы имеете дело с отдельными объектами, имеющими постоянные связи. Вы можете использовать переменную массива, чтобы связать несколько объектов одного типа, но соединения все равно должны выполняться в редакторе Unity, а не во время выполнения. Часто удобно находить объекты во время выполнения, и Unity предоставляет два основных способа сделать это, как описано ниже.

Поиск дочерних игровых объектов

Иногда игровая сцена использует несколько игровых объектов одного типа, таких как предметы коллекционирования, путевые точки и препятствия. Их может потребоваться отслеживать с помощью определенного сценария, который контролирует их или реагирует на них (например, может потребоваться, чтобы все путевые точки были доступны для сценария поиска пути). Использование переменных для связывания этих игровых объектов возможно, но это делает процесс проектирования утомительным, если каждую новую путевую точку нужно перетаскивать в переменную в сценарии. Точно так же, если путевая точка удалена, то удаление ссылки переменной на отсутствующий объект GameObject является неприятностью. В подобных случаях часто лучше управлять набором игровых объектов, сделав их дочерними элементами одного родительского игрового объекта. Дочерние игровые объекты можно получить с помощью родительского компонента Transform Компонент Transform определяет положение, вращение и масштаб каждого объекта в сцена. Каждый GameObject имеет Transform. Подробнее
См. в Словарь (поскольку все игровые объекты неявно имеют преобразование):

Вы также можете найти определенный дочерний объект по имени, используя метод Transform.Find: transform.Find («Сковорода»);

Это может быть полезно, когда у GameObject есть дочерний GameObject, который можно добавлять и удалять во время игры. Хорошим примером этого является инструмент или посуда, которые можно взять и положить во время игры.

Отправка и трансляция сообщений

Во время редактирования проекта вы можете установить ссылки между игровыми объектами в Инспекторе. Однако иногда невозможно настроить их заранее (например, найти ближайший к персонажу предмет в вашей игре или сделать ссылки на игровые объекты, экземпляры которых были созданы после загрузки сцены). В этих случаях вы можете находить ссылки и отправлять сообщения между игровыми объектами во время выполнения.

BroadcastMessage позволяет отправить вызов именованному методу, не уточняя о том, где этот метод должен быть реализован. Вы можете использовать его для вызова именованного метода для каждого MonoBehaviour в конкретном GameObject или любом из его дочерних элементов. При желании вы можете указать, что должен быть хотя бы один получатель (иначе будет сгенерирована ошибка).

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

SendMessageUpwards аналогичен, но отправляет вызов именованного метода в GameObject и все его родители.

Поиск игровых объектов по имени или тегу

Всегда можно найти игровые объекты в любом месте иерархии сцен, если у вас есть информация для их идентификации. Отдельные объекты можно получить по имени с помощью функции GameObject.Find:

GameObject player; void Start()

Объект или набор объектов также можно найти по их тегу с помощью GameObject.FindWithTag и GameObject.FindGameObjectsWithTag.

Например, в кулинарной игре с одним персонажем-поваром и несколькими плитами на кухне (каждая из которых помечена как «Плита»):

GameObject chef; GameObject[] stoves; void Start()

Создание и уничтожение игровых объектов

Вы можете создавать и уничтожать игровые объекты во время работы вашего проекта. В Unity GameObject можно создать с помощью метода Instantiate, который создает новую копию существующего объекта.

Полное описание и примеры создания экземпляров GameObject см. в разделе Создание экземпляров префабов во время выполнения.

Существует также метод Destroy, который уничтожит объект после завершения обновления кадра или, опционально, после небольшой задержки:

Обратите внимание, что функция Destroy может уничтожать отдельные компоненты, не затрагивая сам GameObject. Распространенной ошибкой является написание этого, предполагая, что это уничтожит GameObject скрипт, к которому он прикреплен…

…принимая во внимание, что, поскольку «это» представляет сценарий, а не игровой объект, на самом деле он просто уничтожит вызывающий его компонент сценария, оставив игровой объект позади, а компонент сценария будет удален.

Примитивы

Класс GameObject предлагает основанные на сценариях альтернативы параметрам, доступным в меню GameObject Unity, что позволяет создавать примитивные объекты.

Чтобы создать экземпляры встроенных примитивов Unity, используйте GameObject.CreatePrimitive, который создает экземпляр примитива того типа, который вы указываете. Доступные примитивные типы: Sphere, Capsule, Цилиндр, Куб, Плоскость и Quad Примитивный объект, напоминает плоскость, но его ребра имеют длину всего одну единицу, он использует только 4 вершины, а поверхность ориентирована в плоскости XY локального координатного пространства. Подробнее
См. в Словарь .

Примитивные формы, доступные в меню Unity GameObjectПримитивные формы, доступные в меню Unity GameObject

Как обратиться к объекту через C# скрипт Unity

Есть объект "objBall" — это asset, просто готовый круг. И этот объект должен появляться случайно в разных местах канваса, а игрок должен успеть кликнуть по нему. Сам алгоритм прост, язык C# знаю, по крайней мере — основы, а вот с Unity впервые. И ещё вопрос, скрипт можно прилепить на главную камеру сцены для удобства? Или же надо для отдельного объекта новый скрипт?

CatException's user avatar

Скрипт лучше прикрепит на отдельный объект, например "BallSpawner" или "GameManager". Хотя вариант с камерой будет работать.

Что бы сослаться на объект из скрипта есть довольно много способов. Для вашего случая идеальным будет создать поле класса:

Теперь в инспекторе можно на поле BallPrefab перетащить игровой объект (лучше prefab)

Related Posts