Как обратиться к объекту в unity
Перейти к содержимому

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

  • автор:

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# посредством следующего синтаксиса:

void Start () < Rigidbody rb = GetComponent(); > 

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

void Start () < Rigidbody rb = GetComponent(); // Change the mass of the object's Rigidbody. rb.mass = 10f; > 

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

void Start () < Rigidbody rb = GetComponent(); // Add a force to the Rigidbody. rb.AddForce(Vector3.up * 10f); > 

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

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

Accessing other objects

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

Linking GameObjects with variables

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

public class Enemy : MonoBehaviour < public GameObject player; // Other variables and functions. >

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

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

public class Enemy : MonoBehaviour < public GameObject player; void Start() < // Start the enemy ten units behind the player character. transform.position = player.transform.position - Vector3.forward * 10f; >> 

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.

public Transform playerTransform; 

Соединение объектов через переменные наиболее полезно, когда вы имеете дело с отдельными объектами, имеющими постоянную связь. Вы можете использовать массив для хранения связи с несколькими объектами одного типа, но связи все равно должны быть заданы в редакторе 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):

using UnityEngine; public class WaypointManager : MonoBehaviour < public Transform[] waypoints; void Start() < waypoints = new Transform[transform.childCount]; int i = 0; foreach (Transform t in transform) < waypoints[i++] = t; >> > 

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

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

Finding GameObjects by Name or Tag

It is always possible to locate GameObjects anywhere in the Scene hierarchy as long as you have some information to identify them. Individual objects can be retrieved by name using the GameObject.Find function:

GameObject player; void Start()

Объект или коллекция объектов могут быть также найдены по их тегу, используя функции GameObject.FindWithTag и GameObject.FindGameObjectsWithTag:-

GameObject player; GameObject[] enemies; void Start()

Использование компонентов

Компоненты (Components) определяют поведение объектов в игре. Они — функциональная часть каждого игрового объекта (GameObject). Если вы ещё не поняли взаимосвязи компонентов и игровых объектов, прочитайте страницу GameObjects, прежде чем двигаться дальше.

Игровой объект является контейнером для различных компонентов. По умолчанию у всех игровых объектов есть компонент Transform. Потому что Transform диктует, где расположен игровой объект, и как он поворачивается и масштабируется. Без компонента Transform, игровой объект не будет иметь место в мире. Попробуйте создать пустой игровой объект в качестве примера. Выберите в меню GameObject->Create Empty. Выберите новый игровой объект, и посмотрите в инспектор (Inspector).

Even empty GameObjects have a Transform Component

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

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

Вы можете добавить компоненты к выбранному игровому объекту через меню Components. Сейчас мы попробуем это, добавив Rigidbody на пустой игровой объект, который только что создали. Выделите его и выберите в меню Component->Physics->Rigidbody. После этого, вы увидите, что в инспекторе отобразился компонент Rigidbody и его свойства. Если нажать Play в то время как пустой игровой объект все еще выбран, вы можете получить небольшой сюрприз. Попробуйте, и обратите внимание, как Rigidbody добавил функциональность пустому игровому объекту (Y-компонент игрового объекта начинает уменьшаться, потому что физический движок в Unity заставляет игровой объект падать под действием силы тяжести).

An empty GameObject with a Rigidbody Component attached

Другой вариант заключается в использовании браузера компонентов (Component Browser), который может быть активирована с помощью кнопки Add Component в инспекторе объекта.

The Component Browser

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

Вы можете прикрепить любое количество или комбинацию компонентов к одному игровому объекту. Некоторые компоненты работают лучше в сочетании с другими. Например, Rigidbody работает с любым коллайдером. Rigidbody контролирует Transform через физический движок NVIDIA PhysX,а коллайдер позволяет Rigidbody сталкиваться и взаимодействовать с другими коллайдерами.

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

Редактирование компонентов

One of the great aspects of Components is flexibility. When you attach a Component to a GameObject, there are different values or Properties in the Component that can be adjusted in the editor while building a game, or by scripts when running the game. There are two main types of Properties: Values and References.

Взгляните на изображение ниже. Это пустой Игровой Объект с компонентом Audio Source. Все параметры компонента Audio Source в Инспекторе выставлены по умолчанию.

Компонент содержит одно свойство-ссылку и семь свойств-значений. Audio Clip — это свойство-ссылка. Когда этот аудио источник начинает играть, он будет пытаться проиграть файл, на который ссылается свойство Audio Clip. Если такой ссылки не окажется, то возникнет ошибка, так как никакое аудио не будет проиграно. Вы должны назначить файл в Инспекторе. Это просто: перетащите файл из Project View на свойство-ссылку или с помощью выбора объекта (Object Selector).

Now a sound effect file is referenced in the Audio Clip property

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

Все остальные свойства после Audio Clip это свойства-значения. Они могут быть отрегулированы прямо в Инспекторе. Свойства значения после Audio Clip — это все переключатели, числовые значения и выпадающие меню, но свойства-значения могут также быть текстовыми строками, цветами, кривыми и другими типами. Вы можете узнать больше об этом и о редактировании свойств-значении на странице о редактировании свойств-значений.

Команды контекстного меню компонента

The context menu for a component has a number of useful commands.

The Component Context Menu

Те же команды также доступны через иконку-шестеренку в крайнем верхнем правом углу панели компонента в инспекторе.

Сбросить

Эта команда восстанавливает значения свойств компонента, которые были до самой последней сессии редактирования.

Удалить

Команда Remove Component доступна в случаях, когда вы более не нуждаетесь в связи компонента с игровым объектом. Обратите внимание, что некоторые комбинации компонентов, которые зависят друг от друга, работают только когда Rigidbody также прикреплено; вы увидите предупреждающее сообщение, если вы попробуете удалить компоненты, которые зависят от каких-либо других компонентов.

Move Up/Down

Use the Move Up and Move Down commands to rearrange the order of components of a GameObject in the Inspector.

Tip: Alternatively, click and drag the component’s name up or down in the Inspector window, and then drop it.

Скопировать/Вставить

Команда Copy Component сохраняет тип и текущие настройки свойств компонента. Они могут быть вставлены в другой компонент того же типа с помощью команды Paste Component Values. Вы также можете создать компонент в объекте со скопированными свойствами, используя команду Paste Component As New.

Проверка свойств

Пока ваша игра находится в Режиме Проигрывания, вы вольны изменять свойства любых Игровых Объектов в инспекторе. Например, вы можете захотеть поэкспериментировать с разными высотами прыжка. Если вы создадите свойство Jump Height в скрипте, вы сможете войти в Режим Проигрывания, изменить значение, и нажать кнопку прыжка, чтобы посмотреть, что произойдет. Затем, не выходя из Режима Проигрывания, вы можете изменить его снова и увидеть результат через секунду. Когда вы выйдете из Режима Проигрывания, ваши свойства вернутся к их изначальным “предыгровым” значениям, так что вы не потеряете свои труды. Такой рабочий процесс дает вам невероятную мощь для экспериментов, регулировки и совершенствования геймплея без лишних затрат времени в повторяющихся циклах. Попробуйте это с любыми свойствами в Режиме Проигрывания. Мы думаем, вы будете впечатлены.

  • 2018–09–18 Page amended
  • Ability to drag and drop components in Inspector window added in 5.6

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# посредством следующего синтаксиса:

void Start () < Rigidbody rb = GetComponent(); > 

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

void Start () < Rigidbody rb = GetComponent(); // Change the mass of the object's Rigidbody. rb.mass = 10f; > 

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

void Start () < Rigidbody rb = GetComponent(); // Add a force to the Rigidbody. rb.AddForce(Vector3.up * 10f); > 

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

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

Accessing other objects

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

Linking GameObjects with variables

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

public class Enemy : MonoBehaviour < public GameObject player; // Other variables and functions. >

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

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

public class Enemy : MonoBehaviour < public GameObject player; void Start() < // Start the enemy ten units behind the player character. transform.position = player.transform.position - Vector3.forward * 10f; >> 

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.

public Transform playerTransform; 

Соединение объектов через переменные наиболее полезно, когда вы имеете дело с отдельными объектами, имеющими постоянную связь. Вы можете использовать массив для хранения связи с несколькими объектами одного типа, но связи все равно должны быть заданы в редакторе 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):

using UnityEngine; public class WaypointManager : MonoBehaviour < public Transform[] waypoints; void Start() < waypoints = new Transform[transform.childCount]; int i = 0; foreach (Transform t in transform) < waypoints[i++] = t; >> > 

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

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

Finding GameObjects by Name or Tag

It is always possible to locate GameObjects anywhere in the Scene hierarchy as long as you have some information to identify them. Individual objects can be retrieved by name using the GameObject.Find function:

GameObject player; void Start()

Объект или коллекция объектов могут быть также найдены по их тегу, используя функции GameObject.FindWithTag и GameObject.FindGameObjectsWithTag:-

GameObject player; GameObject[] enemies; void Start()

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

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

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

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

void Start () < Rigidbody rb = GetComponent(); > 

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

function Start () < var rb = GetComponent.(); > 

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

void Start () < Rigidbody rb = GetComponent(); // Change the mass of the object's Rigidbody. rb.mass = 10f; > 

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

void Start () < Rigidbody rb = GetComponent(); // Add a force to the Rigidbody. rb.AddForce(Vector3.up * 10f); > 

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

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

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

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

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

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

public class Enemy : MonoBehaviour < public GameObject player; // Other variables and functions. >

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

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

public class Enemy : MonoBehaviour < public GameObject player; void Start() < // Start the enemy ten units behind the player character. transform.position = player.transform.position - Vector3.forward * 10f; >> 

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

public Transform playerTransform; 

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

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

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

using UnityEngine; public class WaypointManager : MonoBehaviour < public Transform[] waypoints; void Start() < waypoints = new Transform[transform.childCount]; int i = 0; foreach (Transform t in transform) < waypoints[i++] = t; >> > 

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

transform.Find("Gun"); 

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

Нахождение объектов по имени или тегу

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

GameObject player; void Start()

Объект или коллекция объектов могут быть также найдены по их тегу, используя функции GameObject.FindWithTag и GameObject.FindGameObjectsWithTag:-

GameObject player; GameObject[] enemies; void Start()

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *