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

Как прикрепить объект к другому unity

  • автор:

Как присоединить объект через скрипт

В общем штука такая, что я кидаю квадрат, при столкновении с чем-либо он возвращается к игроку. Мне надо чтобы если он врежется в треугольник, то он присоединится к квадрату и они вместе прилетят к игроку. А когда квадрат возвращается, он должен прикрепиться к игроку.

КолжинЕнтер у меня уже прописан, квадрат нормально возвращается к игроку и регистрирует попадания по треугольнику и по игроку. Но вот FixedJoint никак не удаётся включить через скрипт. Помогите, может я неправильно GetComponent пишу (скорее всего так) или есть другой вариант прикрепить квадрат к игроку по возращении (думаю если прикреплю квадрат, аналогично смогу и треугольник в квадрату присоединить).
P.s. Смена Rigidbody на GameObject тоже не работает.

Вот так выглядит колижн:

public Rigidbody2D rb; //Квадрат
public Rigidbody2D player; //Игрок (кто бы мог подумать)

void OnCollisionEnter2D(Collision2D col)
<
Vector2 grabPoint2 = grabPoint.position — transform.position;
rb.AddForce(grabPoint2 * grabForce2, ForceMode2D.Impulse);
Debug.Log(«Попадание»);
if (col.gameObject.tag == «Player»)
<
Debug.Log(«Стыковка»);
rb.gameObject.GetComponent().connectedBody = player;
/*Эту строчку по разному пробовал писать, но Unity выдаёт вот такую ошибку: «There is no ‘FixedJoint2D’ attached to the «Grab» game object, but a script is trying to access it.» Если я правильно понимаю, из-за того что нет FixedJoint2D, то и создать его не получается, а как его тогда создать?*/
>
>

  • BooTheJudge
  • Постоялец

#1
20:09, 25 окт 2021

LzheDmitrey
> Если я правильно понимаю, из-за того что нет FixedJoint2D, то и создать его не
> получается, а как его тогда создать?
https://docs.unity3d.com/ScriptReference/GameObject.AddComponent.html
Сначала надо делать GetComponent, а если оно вернуло null — тогда AddComponent.
Ещё можно добавить компонент заранее на префабе объекта, по производительности лучше будет. AddComponent и проверки на null довольно затратны.

  • LzheDmitrey
  • Постоялец

#2
20:19, 25 окт 2021

BooTheJudge
О боже, какой я идиот, забыл про AddComponent. Большое спасибо, просто поменял Get на Add и всё сработало

  • LzheDmitrey
  • Постоялец

#3
20:21, 25 окт 2021

BooTheJudge
А можете пояснить как добавить компонент на префаб заранее? Это мне на «треугольник» надо заранее повесить Joint, но он же сразу активированным будет, нет?

  • LzheDmitrey
  • Постоялец

#4
23:19, 25 окт 2021

А теперь ещё вопрос, как передать через AddComponent breakeForce в FixedJoint2D?

  • BooTheJudge
  • Постоялец

#5
10:08, 26 окт 2021

LzheDmitrey
> Это мне на «треугольник» надо заранее повесить Joint, но он же сразу
> активированным будет, нет
Я почему-то подумал, что он не будет работать, пока не задашь ConnectedBody. Но потом вспомнил, что в этом случае он привязывается к фиксированной точке в пространстве. Значит, так наверное не пойдёт.

LzheDmitrey
> А теперь ещё вопрос, как передать через AddComponent breakeForce в
> FixedJoint2D?
AddComponent возвращает ссылку на добавленный компонент, точно так же, как это делает GetComponent. То есть делаешь

FixedJoint2D joint = rb.gameObject.AddComponent(); joint.breakForce = //тут константа или переменная с нужным значением силы
  • LzheDmitrey
  • Постоялец

#6
10:12, 26 окт 2021

BooTheJudge
Большое спасибо

Управление игровыми объектами (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()

Как прикрепить объект к другому unity

Текущее время: 30 апр 2024, 09:57

Как прикрепить объект к другому подвижному объекту

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.
Сообщений: 4 • Страница 1 из 1

Как прикрепить объект к другому подвижному объекту

Meduza 30 апр 2017, 19:20

Всем привет. Делаю стрельбу по подвижным целям. Когда пуля ударяется об колайдер, то она оставляет после себя префаб отверстия(сама пуля удаляется). Но, так как цели у меня подвижные, при попадании по цели отверстие не привязывается к объекту. То есть, надо привязать отверстие к подвижной цели. Вроде есть такая штука как

Синтаксис:
Синтаксис: [ Показать ]
Используется csharp
transform . parent

, но не могу придумать как это реализовать. Думаю, надо мутить что-то с тегами и поиск объекта. В общем, не знаю. Надеюсь на ваш совет или помощь кодом.

Двум смертям не бывать, одной не миновать.

Meduza UNец Сообщения: 4 Зарегистрирован: 28 апр 2017, 00:16 Откуда: Украина

Re: Как прикрепить объект к другому подвижному объекту

Anonymyx 30 апр 2017, 21:33

отверстие.transform.parent = подвижныйОбъект.transform;
У Instantiate() есть перегрузка с этим аргументом даже.

Anonymyx Адепт Сообщения: 1973 Зарегистрирован: 05 апр 2015, 15:55

Re: Как прикрепить объект к другому подвижному объекту

Meduza 05 май 2017, 00:41

решил свою проблему
Двум смертям не бывать, одной не миновать.

Meduza UNец Сообщения: 4 Зарегистрирован: 28 апр 2017, 00:16 Откуда: Украина

Re: Как прикрепить объект к другому подвижному объекту

MANMANA 05 май 2017, 02:27

Meduza писал(а): решил свою проблему

это хорошо.
Плохо, что не оставил тем, кто потом сюда зайдет, само решение проблемы

  • Сайт

Сообщений: 4 • Страница 1 из 1

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 22

  • Список форумов
  • Техподдержка • Наша команда • Удалить cookies конференции • Часовой пояс: UTC + 3 часа

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB

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

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

Отслеживать
задан 8 янв 2022 в 17:52
142 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
142 8 8 бронзовых знаков

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

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

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

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

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

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

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