Создайте 3D-ось для перемещения объекта (в Unity)

avatar
Blublub
8 августа 2021 в 16:38
197
1
-1

Здравствуйте!

Я хочу сделать редактор уровней для проекта, и для этого мне нужна 3D-ось для перемещения объекта. У меня есть оси, но я хочу, чтобы пользователь мог перемещать их, перетаскивая одну ось: щелкните ось X (красная), перетащите ось, и она переместится (например, единство , блендер или УП это делают).

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

Блулуб.

Источник

Ответы (1)

avatar
yasirkula
8 августа 2021 в 17:49
0

Вот один из способов сделать это:

  • Raycast против самолета XZ
  • Найти вектор направления, который начинается от центра стрелок и заканчивается в точке попадания
  • Поскольку этот вектор направления может смотреть в любом направлении в плоскости XZ, спроецируйте его на ось X, чтобы ограничить его этой осью
  • Переместить стрелки по полученному вектору
Vector3 xAxis = Vector3.right;
Vector3 yAxis = Vector3.up;
Vector3 arrowsCenterPosition = ...;
Plane plane = new Plane( yAxis, arrowsCenterPosition ); // Create a virtual plane on XZ directions
Ray ray = Camera.main.ScreenPointToRay( Input.mousePosition );
if( plane.Raycast( ray, out float enter ) ) // Raycast against that plane
{
    Vector3 hitPoint = ray.GetPoint( enter ); // The point that hit the virtual plane
    Vector3 directionToHitPoint = hitPoint - arrowsCenterPosition;

    // We want to move in X axis but our directionToHitPoint can be in any direction in XZ plane,
    // so we need to project it onto X axis
    Vector3 xAxisMovement = Vector3.Project( directionToHitPoint, xAxis );

    // You can move the arrows by xAxisMovement amount
    arrowsCenterPosition += xAxisMovement;
}