Я задаю еще один вопрос - перетаскивание мышью (я использую Unity с C #), но с менее частой конкретной деталью: наличие препятствий в середине пути, по которому происходит перетаскивание (3D-пространство, а не 2D) ,
Позволь мне объяснить. Предположим, у меня есть самолет, по которому я хочу перетащить куб с именем «obj». Это легко. Вот моя простая реализация для этого:
void Update () {
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if(Physics.Raycast(ray, out hit, 1000000))
obj.transform.position = new Vector3(hit.point.x,0.25F,hit.point.z);
}
Оно работает. Однако предположим, что у меня также есть несколько других кубов над плоскостью, которые являются препятствиями. Очевидно, что когда игрок перемещает «объект» по плоскости, такое движение должно быть заблокировано препятствиями. И затем, сталкиваясь с препятствиями, «объект» должен двигаться только по обрезанным сторонам этого препятствия. Если мышь перемещается и «obj» перестает сталкиваться с препятствиями, свободное движение в стиле перетаскивания возобновляется снова.
Чтобы усложнить задачу, я изо всех сил стараюсь добиться этого без использования компонентов RigidBody на препятствиях (перетаскиваемый объект может иметь это). Любые идеи о том, что является наиболее эффективным способом достижения этого? Большое спасибо!
РЕДАКТИРОВАТЬ: Комментаторы обратили мое внимание, что я должен упомянуть, что объекты могут вращаться при привязке.
РЕДАКТИРОВАТЬ 2: Учитывая сложность первоначальной формулировки, я изменил вопрос, разрешающий использование компонентов Rigidbody на перетаскиваемых объектах. Решение просто не может использовать компоненты Rigidbody на препятствиях.
Ответы:
Трудно обнаружить столкновение без участия каких-либо твердых тел, но поскольку вы используете кубы, вы можете использовать Bounds.Intersects . Каждое обновление проверяет, пересекаются ли границы перетаскиваемого объекта с границами каких-либо препятствий. Если это так, то вы можете попробовать это:
Вы никогда не прекращаете перетаскивать блок; пользователю просто кажется, что блок прекратил перетаскивать, когда он будет пересекаться с препятствием.
источник
Не сделав этого сам, вот что я попробую:
Мне кажется, что если вы хотите, чтобы ваш объект перемещался вдоль наклонной плоскости препятствия, вам просто нужно, чтобы его преобразование продолжало следовать позиции последнего попадания лучевой передачи.
источник