Управление плеером по оси Z с помощью мыши по оси X - PullRequest
0 голосов
/ 17 апреля 2020

Я пытаюсь переместить игрока в положение мыши в моей игре. Сейчас движение вдоль оси x работает нормально, но я хочу, чтобы ось мыши y управляла движением персонажей вдоль оси z (поскольку моя нисходящая камера y является миром z).

Прямо сейчас мышь y управляет игроком y, , который выглядит так в игре.

И код для него выглядит так:

public Vector2 mousePos;
private Vector3 playerPos;

void update()
{
    // Get mouse position from player
    mousePos = Input.mousePosition;

    // Move player with mouse
    playerPos = new Vector3(mousePos.x, 0, mousePos.y);
    transform.position = Camera.main.ScreenToWorldPoint(playerPos);
}

Затем я попытался просто поменять местами y и z вот так

playerPos = new Vector3(mousePos.x, mousePos.y, 0);

Но вместо того, чтобы позволить мне контролировать ось z, этот фрагмент вместо этого заставляет игрока терять все движения.

Я очень новичок в кодировании, так что я могу быть пропустить что-то совершенно очевидное. Что я делаю не так?

Версия Unity: 2018.4.21f1

1 Ответ

0 голосов
/ 17 апреля 2020

Пример, который вы привели, не работает, потому что вы задаете координату 0, равную 0, и при вызове на перспективной камере Camera.ScreenToWorldPoint выполняет некоторую векторную математику, поэтому при просмотре сцены ваш плеер, вероятно, плавает прямо сверху вашей камеры. Я не могу объяснить математику, потому что не понимаю, но, к счастью, нам обоим это не нужно! По сути, координата z говорит о том, как далеко от камеры находится точка, и поскольку область обзора перспективной камеры сужается ближе к камере, размещение ее в 0 означает, что ей некуда под go. You can see here как перемещение объекта дальше от камеры требует, чтобы он двигался дальше, чтобы соответствовать положению мыши.

Большая проблема в том, что ваш метод неправильный и есть лучший способ. Camera.ScreenToWorldPoint преобразует координату мыши в мировую пространственную координату в зависимости от того, на что смотрит камера, поэтому вы по сути переключаете координаты y и z, а затем вводите их в метод, который определяет, какие координаты необходимо перевернуть.

Похоже, этот скрипт прикреплен к вашему игровому объекту GameObject, поэтому он должен выглядеть следующим образом:

Camera cam;
[Range(1,10)]  //this just creates a slider in the inspector
public int distanceFromCamera;

void Start()
{
    //calling Camera.main is a shortcut for 
    //FindGameObjectsWithTag("MainCamera")
    //so you should avoid calling it every frame
    cam = Camera.main;
}

void Update()
{
    //This will work for both perspective and orthographic cameras
    transform.position = cam.ScreenToWorldPoint(
        Input.mousePosition + new Vector3(0,0,distanceFromCamera));
}

Если ваша камера будет перемещаться ближе или дальше от плоскости, убедитесь, что добавить что-то, что будет держать расстояние от камеры обновленным.

Тем не менее, для большинства игр привязка игрока к курсору мыши обычно не то, что вы ищете. Как правило, вы хотите, чтобы какой-то ввод перемещал игрока в определенном направлении на определенную величину. Если это то, что вы ищете, эта часть руководства по космическим шутерам является хорошим введением в движение игрока (хотя сам код может быть устаревшим).

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