Unity как привязать один объект к другому
Перейти к содержимому

Unity как привязать один объект к другому

  • автор:

Постоянная привязка одного объекта к другому

Есть задача: жестко привязать один объект к другому.
Есть куб, который создается из префаба. Есть линия (готовый скрипт из ассет-стора), которая создается скриптом. У линии есть две позиции (начальная и конечная).
Мне нужно, чтобы при перемещении куба, конечная позиция лини, следовала за кубом (т.е. какбэ была привязана к нему).
И куб и линия являются дочерними объектами родительского объекта. (Линий и кубов очень много).
На кубе висит скрип с методом OnMouseDown(). Т.е. я кликаю на куб и он перемещается (это у меня работает).

Искать линию по имени, честно говоря не хочется (ибо их очень много).

Искомая линия, всегда находится над кубом в сцене. Т.е. мне тупо, надо обратиться к объекту который надо мной.

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

Или я вообще не в те дебри полез?

UPD.
Было бы вообще круто, если при создании этих объектов, линия (точнее ее конечная позиция), былабы привязана к кубу на всегда. И перемещая куб, она бы всегда следовала бы за ним.

Как присвоить родителя в Unity?

Есть платформа, рандомно создается блок по скрипту, хочу что бы блок создавался как дочерний объект платформы. Как это сделать?

З,Ы. Если найду в инете ответ, напишу.

  • Вопрос задан более трёх лет назад
  • 13940 просмотров

1 комментарий

Оценить 1 комментарий

Михаил Моор @pasitiv Автор вопроса

Не получается вызвать функцию Chield.transform.SetParent(Parent.transform);

Ругается: Setting the parent of a transform which resides in a prefab is disabled to prevent data corruption.

Что делать, ума не приложу.

Решения вопроса 1

BasmanovDaniil

Даниил Басманов @BasmanovDaniil
Геймдизайнер-телепат

Поменять родителя у трансформа можно с помощью вызова Transform.SetParent либо прямой замены Transform.parent. Кроме того, в последних версиях юнити появилась новая версия Instantiate, которая позволяет указать родителя при создании объекта.

using UnityEngine; public class NewBehaviourScript : MonoBehaviour < public Transform prefab; public Transform parent; private void Start() < // Создаём новый объект из префаба var child = Instantiate(prefab); // Присваиваем родителя child.SetParent(parent); // Либо так child.parent = parent; // Либо сразу в одну строчку var child = Instantiate(prefab, parent); >>

Отвечая на ваш комментарий, проверьте кому вы пытаетесь присвоить родителя, префабу или новому объекту.

Как сделать привязку двух объектов через скрипт в Unity?

У меня есть два рядом находящихся объекта, которые мне нужно связать между собой через скрипт. При этом, нужно сделать так, чтобы при перемещении одного объекта, вместе с ним перемещался и другой. Подскажите пожалуйста, можно ли так сделать, и если можно, то как? P.S В Unity совсем новичок, заранее спасибо!

Отслеживать
задан 8 янв 2022 в 17:52
132 8 8 бронзовых знаков

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Все оказалось в разы проще, чем я думал:

using UnityEngine; public class Parent : MonoBehaviour < public GameObject player; public void SetParent(GameObject newParent) < player.transform.parent = newParent.transform; >> 

Отслеживать
ответ дан 8 янв 2022 в 19:53
132 8 8 бронзовых знаков

  • c#
  • unity3d
  • разработка-игр
    Важное на Мете
Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.10.27.43697

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Программирование в Unity для опытных программистов

В Unity скрипты можно использовать для разработки практически любого элемента игры или интерактивного контента с графикой реального времени. Unity поддерживает скрипты на C#, созданные в соответствии с одним из двух основных подходов: традиционным и широко использующимся объектно-ориентированным подходом и информационно-ориентированным подходом, который теперь тоже поддерживается в Unity в отдельных случаях благодаря нашему высокопроизводительному многопоточному стеку информационно-ориентированных технологий (DOTS).

На этой странице

  • Если у вас есть опыт программирования на C++
  • Объекты GameObject и компоненты
  • Программирование компонентов в Unity
  • Преимущества информационно-ориентированного подхода
  • Современное оборудование
  • Отладка в Unity
  • Системы программирования в Unity
  • Настройка редактора Unity

Знакомитесь с Unity, имея знания C++?

Unity поддерживает C#, стандартный в отрасли язык программирования, в некоторой степени похожий на Java или C++.

По сравнению с C++, C# легче в изучении. Кроме того, он относится к категории языков «с управлением памятью», то есть он автоматически распределяет память, устраняет утечки и так далее.

Как правило C# удобнее C++, если вам нужно в первую очередь разработать игру, а потом уже работать над различными сложными аспектами программирования.

Объекты GameObject и компоненты в Unity

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

Любой объект в игре является GameObject, будь то персонажи, источники света, спецэффекты, декорации и все остальное.

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

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

Компоненты имеют ряд свойств или переменных, которые можно настроить в окне Inspector редактора Unity и/или с помощью скрипта. В примере выше к свойствам источника света относятся дальность, цвет и интенсивность.

Программирование компонентов в Unity

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

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

Демофильм Unity Megacity создан на основе DOTS

Преимущества информационно-ориентированного подхода с DOTS

Традиционная модель «игровой объект — компонент» хорошо работает и сегодня, поскольку она проста как для программистов, так и других пользователей, а также удобна для создания интуитивных интерфейсов. Добавите компонент Rigidbody к объекту GameObject — он начнет падать, добавите компонент Light — GameObject начнет излучать свет. Все остальное также подчиняется этой простой логике.

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

Компоненты и игровые объекты относятся к «тяжелым объектам C++». Все объекты GameObject имеют имя. Их компоненты представляют собой оболочки для C# поверх компонентов на C++. Это упрощает работу с ними, но может влиять на производительность, если они будут храниться в памяти без явной структуры. Объект C# может находиться на любом участке памяти. Объект C++ также может находиться в любом участке памяти. Группировка и последовательное размещение объектов в памяти отсутствуют. При каждой загрузке в центральный процессор для обработки объект приходится собирать по частям из разных участков памяти. Это может сильно замедлить загрузку, а оптимизация потребует много усилий.

Для решения этих проблем мы начали перерабатывать базовые системы Unity на основе высокопроизводительного, многопоточного стека информационно-ориентированных технологий или DOTS (в настоящее время в статусе предварительной версии).

DOTS позволяет вашей игре эффективно использовать все возможности новейших многоядерных процессоров. Стек состоит из следующих компонентов:

  • система задач C# для эффективного исполнения кода на многопоточных системах;
  • Entity Component System (ECS) для разработки высокопроизводительного кода по умолчанию;
  • компилятор Burst для компиляции скриптов в оптимизированный нативный код.

ECS — это новая система компонентов в составе DOTS; все традиционные объектно-ориентированные манипуляции над GameObject отражаются на экземпляре в новой системе. Название «Компонент» никак не изменилось. Важнейшее отличие — в структуре данных. Подробнее об этом можно узнать из статьи «О DOTS: Entity Component System».

Демофильм Unity Megacity создан на основе DOTS

Используйте все возможности современного оборудования

Помимо того, что это улучшенный подход к написанию кода игры с точки зрения дизайна, ECS позволяет вам использовать систему задач C# Unity и компилятор Burst и тем самым полностью использовать преимущества современного оборудования.

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

Некоторые из технологий DOTS все еще находятся в статусе предварительной версии, поэтому мы советуем разработчикам использовать стек для решения отдельных вопросов производительности проекта, не строить на базе DOTS весь проект. См. раздел «Дополнительные ресурсы» в конце этой страницы, где указаны ссылки на ключевые ресурсы DOTS.

Unity Profiler для оптимизации производительности

Отладка в Unity

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

Вот несколько полезных ресурсов по оптимизации в Unity:

Наилучшие методики для общих случаев (включая подробные советы по оптимизации системы интерфейса Unity)

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

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