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

Я хочу что-бы Container появлялся на позиции объекта itemButton с небольшой поправкой по оси Y. Координаты Container по оси X задаются корректно, а вот по оси Y он оказывается далеко за пределами экрана. Если размещать его не делая поправку, то всё работает нормально. В чём проблема?
- Вопрос задан более года назад
- 328 просмотров
Как узнать координату X объекта в unity?

а как правильно получить ссылку. на объект. сделать скрипт. куда вешать — туториалы на саите юнити..

GavriKos @GavriKos Куратор тега Unity
Я бы еще дополнил всякими ScreenToWorldPoint и обратными операциями. А то фиг его координату в какой системе отчета надо получить
HapBox @HapBox Автор вопроса
Denis Gaydak, Спасибо большое.
RuslanVoronin @RuslanVoronin
Вот советы про то, что человеку бросать, а что нет, могли бы оставить при себе. Если не хотите помогать, зачем отвечать? Русскоязычное сообщество в действии, что тут сказать.
RuslanVoronin, замечание в точку
Ответы на вопрос 0
Ваш ответ на вопрос
Войдите, чтобы написать ответ

- C#
- +1 ещё
Как проверять столкновение префаба и UI панели в Unity?
- 1 подписчик
- час назад
- 10 просмотров
Изменить позицию объекта через код

Задавать позицию объекта в коде можно через свойство transform.position .
// Задать позицию для текущего объекта void Update() < transform.position = new Vector3(8.768f, -1.74f, 0); >
Можно также не указывать точную позицию, куда надо переместить объект, а указать, например, на какое расстояние переместить объект направо.
// При каждом выполнении кода, объект будет сдвигаться направо на 1.50 void Update() < transform.position = transform.position + new Vector3(1.50f, 0, 0); >
Код выполняется для текущего объекта, для которого был создан скрипт. Можно изменить позицию указанного объекта через метод GameObject.Find() .
// Задать позицию для объекта с именем «name_object» void Start() < GameObject.Find("name_object").transform.position = new Vector3(8.768f, -1.74f, 0); >
Обновлено: 04 ноября 2020
Комментарии
Авторизуйтесь, чтобы добавлять комментарии
Управление игровыми объектами (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()
Направление и расстояние от одного объекта до другого.
Если вычесть координаты одной точки в пространстве из координат другой, то получим вектор, который “выходит” из второй точки и “заканчивается” в первой:
// Gets a vector that points from the player's position to the target's. var heading = target.position - player.position;
Помимо того, что этот вектор указывает в направлении объекта, модуль данного вектора равен расстоянию между двумя позициями. Часто нам требуется нормированный вектор, который показывает направление к цели, а также расстояние (скажем, для управления снарядом). Расстояние между двумя объектами равно модулю направляющего вектора, он может быть нормирован, достаточно разделить на его модуль:-
var distance = heading.magnitude; var direction = heading / distance; // This is now the normalized direction.
Лучше выбрать именно такой подход, нежели использовать модуль и нормаль отдельно, из-за их склонности нагружать CPU (оба используют вычисления квадратных корней).
Если расстояние нужно лишь для сравнения (скажем, проверка на достаточную удаленность), тогда вообще можно не вычислять значение модуля. Свойство sqrMagnitude возвращает квадрат модуля, оно высчитывается подобно расстоянию, но без затратной по времени операции нахождения квадратного корня. Вместо того, что сравнивать модуль с известным расстоянием, можно сравнить квадрат модуля с квадратом расстояния:-
if (heading.sqrMagnitude < maxRange * maxRange) < // Target is within range. >
Это намного более эффективно, чем вычислять именно модуль при сравнении.
Иногда, требуется узнать направление к надземной цели. Например, представьте, что игроку, который стоит на земле нужно приблизиться к парящему в воздухе предмету. Если вычесть координаты позиции игрока из координат цели, тогда полученный вектор будет указывать вверх и по направлению к цели. Этот вариант не подходит, чтобы придать ориентацию компоненту transform игрока, так как он тоже будет указывать вверх. Что тут действительно нужно сделать — это вычислить вектор от игрока к позиции на земле прямо под предметом. Это легко сделать, если у вектора, являющегося результатом вычитания, установить координату Y в ноль:-
var heading = target.position - player.position; heading.y = 0; // This is the overground heading.
Изменить позицию объекта через код

Задавать позицию объекта в коде можно через свойство transform.position .
// Задать позицию для текущего объекта void Update() < transform.position = new Vector3(8.768f, -1.74f, 0); >
Можно также не указывать точную позицию, куда надо переместить объект, а указать, например, на какое расстояние переместить объект направо.
// При каждом выполнении кода, объект будет сдвигаться направо на 1.50 void Update() < transform.position = transform.position + new Vector3(1.50f, 0, 0); >
Код выполняется для текущего объекта, для которого был создан скрипт. Можно изменить позицию указанного объекта через метод GameObject.Find() .
// Задать позицию для объекта с именем «name_object» void Start() < GameObject.Find("name_object").transform.position = new Vector3(8.768f, -1.74f, 0); >
Обновлено: 04 ноября 2020
Комментарии
Авторизуйтесь, чтобы добавлять комментарии
Как узнать координату X объекта в unity?

а как правильно получить ссылку. на объект. сделать скрипт. куда вешать — туториалы на саите юнити..

GavriKos @GavriKos Куратор тега Unity
Я бы еще дополнил всякими ScreenToWorldPoint и обратными операциями. А то фиг его координату в какой системе отчета надо получить
HapBox @HapBox Автор вопроса
Denis Gaydak, Спасибо большое.
RuslanVoronin @RuslanVoronin
Вот советы про то, что человеку бросать, а что нет, могли бы оставить при себе. Если не хотите помогать, зачем отвечать? Русскоязычное сообщество в действии, что тут сказать.
RuslanVoronin, замечание в точку
Ответы на вопрос 0
Ваш ответ на вопрос
Войдите, чтобы написать ответ

- C#
- +1 ещё
Как проверять столкновение префаба и UI панели в Unity?
- 1 подписчик
- 2 часа назад
- 13 просмотров