Использование Camera.main.ScreenToWorldPoint во время движения камеры - PullRequest
0 голосов
/ 11 декабря 2018

хочу сделать игру, где есть 2D мяч, который перемещается в позицию курсора.Чтобы получить позицию курсора, я использую этот код:

Vector2 PixelPos = Input.mousePosition;

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

Vector2 Pos = Camera.main.ScreenToWorldPoint(PixelPos);

Проблема в том, чтоОсновная камера движется вверх так, что заставляет игрока двигаться.Но когда он двигается, я получаю какое-то странное движение с мячом (когда камера движется вверх, она всегда перемещает мяч)

Есть ли альтернативный способ заставить эту работу ??

Или, проще говоря, я могу заменить этот кусок кода:

Vector2 Pos = Camera.main.ScreenToWorldPoint(PixelPos);

другими вещами, для которых не требуется камера для преобразования положения экрана в мировое положение?

Спасибо!

1 Ответ

0 голосов
/ 11 декабря 2018

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

Сначала создайтеваш виртуальный курсор как GameObject.На Update вы можете обновить его положение с помощью

float sensitivity = 1f;
transform.position += sensitivity * new Vector2( 
        Input.GetAxis("Mouse X"), 
        Input.GetAxis("Mouse Y")
);

Then, instead of using the camera to find the cursor position, you just check the `transform.position` of that virtual cursor `GameObject`.

Во-вторых, вам нужно заблокировать встроенный курсор.Вы можете сделать это с помощью

Cursor.lockState = CursorLockMode.Locked;

Если вам нужно отменить это (например, если вы вызываете меню и вам нужно использовать обычный курсор без перемещения виртуального курсора вокруг), то вы можете использовать:

Cursor.lockState = CursorLockMode.None; 

или, если вам нужно, чтобы курсор оставался в окне:

Cursor.lockState = CursorLockMode.Confined;

Если вы хотите переместить шар только в последнюю позицию, нажатую / коснуласьтогда вот более простое решение.

Отслеживайте позицию цели для мяча, и, если она была установлена:

private Vector2 moveGoalPos;
private bool moveGoalSet= false;

Измените moveGoalPos только на кадрахтам, где щелкают мышью / касаются экрана. :

bool isTouched;
if (isMouseEnable) {
    isTouched = Input.GetMouseButtonDown(0);
    PixelPos = Input.mousePosition;
} else {
    isTouched = Input.touchCount > 0;
    Touch touch = Input.GetTouch(0);
    PixelPos = touch.position;
}

if (isTouched) {
    moveGoalPos= Camera.main.ScreenToWorldPoint(PixelPos);
    moveGoalSet= true;
}

Однако на каждом кадре вы хотите перемещать мяч в мировое пространство moveGoalPos (только если цельбыло установлено):

if (moveGoalSet) {
    Vector2 OffsetPos = moveGoalPos + CursorOffSet; 

    GCursor.transform.position = OffsetPos; 
    print(OffsetPos);   
    Vector2 LerpPos = Vector2.Lerp(rb.transform.position, OffsetPos, 0.05f);

    rb.MovePosition(LerpPos);
}

Когда вам нужно остановить перемещение шара в последнюю позицию касания / нажатия (например, если вы изменили или сбросили уровень), вам нужно сбросить moveGoalSet:

moveGoalSet = false;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...