#unity3d
#unity3d
Вопрос:
Я создаю химическую игру в Unity, где каждый атом представлен в виде сферы 3D GameObject. Я хочу, чтобы пользователь мог перетаскивать атом, и если он входит в некоторый заданный радиус другого элемента, с которым он может объединяться, два атома «прилипают» друг к другу (или становятся «всасываемыми» вместе) и становятся одним объектом, который можно перетаскивать и взаимодействовать с ним.
Как это выглядит сейчас:
Как я хочу, чтобы это выглядело после взаимодействия:
Теперь начинается самая трудная часть — попытка понять, как это сделать. Сначала я прикрепил скрипт к атому кислорода (красная сфера). Я хочу посмотреть, вошел ли атом водорода в какой-то радиус. Если это произойдет, я создаю новый GameObject, создаю дочерние элементы oxygen и hydrogen для этого объекта, даю новому GameObject жесткое тело и коллайдер и отключаю жесткие тела дочерних элементов. Так что проблема в том, что как только я это делаю, обе сферы проваливаются сквозь землю. Кроме того, они по-прежнему остаются отдельными сферами и не выглядят «склеенными» вместе. Если я перетаскиваю красную сферу по кругу, белая не следует за ней, и наоборот.
Любая помощь была бы очень признательна.
void OnCollisionEnter(Collision collision)
{
if(collision.gameObject.name == "HydrogenPrefab(Clone)")
{
Debug.Log("Hydrogen entered");
GameObject HOCombo = new GameObject();
//put both atoms under the same parent
collision.gameObject.transform.parent = HOCombo.transform;
this.transform.parent = HOCombo.transform;
//remove the rigidbodies
this.GetComponent<Rigidbody>().isKinematic = true;
collision.gameObject.GetComponent<Rigidbody>().isKinematic = true;
// make the parent a rigidbody;
HOCombo.AddComponent<Rigidbody>();
HOCombo.AddComponent<MeshCollider>();
}
}
Комментарии:
1. Я думаю, вы захотите изучить фиксированный совместный подход — звучит как именно то, что вам нужно.
2. Создание кинематических жестких тел — это не то же самое, что их удаление. Другой проблемой может быть добавленный вами сетчатый коллайдер. Если вы проверите GameObject в редакторе, вы, вероятно, заметите, что в нем отсутствует сетка. @Serlite верен, хотя соединение было бы лучшим.
3. Это довольно просто, но вы подумали о следующем шаге? И следующий шаг? Я предполагаю, что в конце дня вы хотите создать более крупные и сложные молекулы. Возможно, не гиганты, такие как макромолекулы, а, возможно, скелетные или проволочные. У вас есть план, как все это сделать? Поскольку это ваш шаблон / модель, вы должны определить и применить к легким / простым структурам, таким как вода. Просто совет…
4. Еще раз привет!
Fixed Joint
подход выглядит очень многообещающим. Причина, по которой вы могли перетащить только красный атом, заключается в том, что когда вы делаетеraycast
это, чтобы получить сферу, она возвращает только самый первый коллайдер, на который она попадает. И поскольку вы не отключили collider для дочерних элементов, существует очень высокая вероятность того, что вашraycast
ударит по нему (он также может поразить родительский коллайдер, но я думаю, вам не повезло). Когда он попадает, вы получаете дочерний элемент, а не родительский => вы перетаскиваете дочерний элемент, а не родительский => ожидаемое поведение. :35. Спасибо за
FixedJoint
предложение. Мне удалось соединить два атома, и это отлично работает. Однако для такой молекулы, как вода, мне нужно, чтобы два атома водорода прилипали к кислороду, и я не выяснил, как получить два неподвижных соединения на одном объекте. Кроме того, если кто-то может написать ответ на этот вопрос, я приму его.
Ответ №1:
Похоже, вам подойдет фиксированное соединение. Также убедитесь, что вы получаете правильный объект при его радиопередаче. Вероятно, вам потребуется переместить дочерние элементы на слой, игнорируемый вашей raycast, или использовать RaycastAll, чтобы получить все хиты (не только первый) и оттуда найти нужного родителя.
Комментарии:
1.
Fixed Joints
правильно, но я также хотел добавить, что для получения нескольких из них мне пришлось прикрепить фиксированные соединения к дочерним объектам и сделать их дочерними для родительского объекта. В моем случае я добавил компоненты FixedJoint к объектам hydrogen и сделал объекты hydrogen дочерними объектами объекта oxygen.