Преобразовать границы движения в локальную ось - PullRequest
1 голос
/ 17 октября 2019

У меня есть этот код, который прекрасно работает, перемещая объект по локальной оси X (таковой у игрового объекта)

    var vel = rb2d.velocity;
    if (Input.GetKey(moveLeft)) {
        rb2d.velocity = -transform.right * speed;
    }
    else if (Input.GetKey(moveRight)) {
        rb2d.velocity = transform.right * speed;
    }
    else {
        rb2d.velocity = transform.right * 0;
    }

Однако мне также нужно ограничить его перемещение по локальной оси X, ноне могу понять это. Пока у меня есть это:

    var pos = transform.position;
    if (pos.x > boundX) {
        pos.x = boundX;
    }
    else if (pos.x < -boundX) {
        pos.x = -boundX;
    }
    transform.position = pos;

, который прекрасно работает, если локальная ось X выровнена с мировой осью X, но, очевидно, я хочу, чтобы она работала на локальной оси X для gameObjects, которые не«т. Я не могу понять, как преобразовать точки мира в локальные. Я возился с InverseTransformPoint , но не могу заставить его работать.

1 Ответ

1 голос
/ 17 октября 2019

Вы можете сделать это с помощью некоторой векторной математики.

Сначала найдите смещение объекта в мировом пространстве вдоль его локальных осей x и y:

float xOffset = Vector2.Dot(transform.position,transform.right);
float yOffset = Vector2.Dot(transform.position,transform.up);

Затем зафиксируйте xOffset до границ:

xOffset = Mathf.Clamp(-boundX,boundX,xOffset);

Затем примените смещения обратно к их осям и сложите их вместе, чтобы получить позицию:

transform.position = xOffset * transform.right + yOffset * transform.up;

Всего:

float xOffset = Vector2.Dot(transform.position, transform.right);
float yOffset = Vector2.Dot(transform.position, transform.up);

xOffset = Mathf.Clamp(xOffset, -boundX, boundX);

transform.position = xOffset * transform.right + yOffset * transform.up;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...