Почему моя камера не показывает предметы, если я не переместил ее в отрицательную позицию Z в 2D - PullRequest
0 голосов
/ 10 октября 2018

Добрый день всем

Я работаю над базовой 2D игрой, чтобы освоить использование Unity.Я написал функцию, которая позволяет мне ограничивать, насколько далеко могут перемещаться несколько игровых объектов, которые я использую как для камеры, так и для персонажа игрока и вражеских юнитов.Функция использует Mathf.clamp для ограничения этого движения.

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

После некоторых полезных советов из предыдущего поста, который я сделал (см. здесь ) (также, пожалуйста, не отмечайте это как дубликат, так как мой вопрос сосредоточен на обновленной версии моего кодаи на самом деле я пытаюсь понять, почему происходит эта ошибка), я обнаружил, что могу использовать Vector3, чтобы получить больше контроля над тем, где заканчивается камера.Другой пользователь предложил, чтобы позиция Vector2 переместила мою камеру в другое положение Z, и если я переместлю камеру в отрицательное положение Z, это должно решить мою проблему.

Мой код теперь выглядит следующим образом:и на самом деле работает правильно:

    public void constrain(GameObject obj, bool isCamera = false)
    {
        Vector3 pos = obj.transform.position;
        pos.x = Mathf.Clamp(pos.x, -maxX, maxX);
        pos.y = Mathf.Clamp(pos.y, -maxY, maxY);
        if(isCamera)
            pos.z = -10;
        else
            pos.z = 1;
        obj.transform.position = pos;
    }

    GameObject camera = GameObject.Find("Main Camera");
    constrain(camera.gameObject,true); //if you are constraining the camera object

    GameObject player= GameObject.Find("Player");
    constrain(player.gameObject,true); //skip the optional parameter if not referencing the camera

Однако еще один пользователь предложил, что мне не нужно иметь дополнительный параметр bool, чтобы проверить, является ли это камерой.Камера не должна менять свое положение Z, так как это установлено в строке:

Vector3 pos = obj.transform.position;

Таким образом, я должен упростить функцию следующим образом:

    public void constrain(GameObject obj, bool isCamera = false)
    {
        Vector3 pos = obj.transform.position;
        pos.x = Mathf.Clamp(pos.x, -maxX, maxX);
        pos.y = Mathf.Clamp(pos.y, -maxY, maxY);            
        obj.transform.position = pos;
    }

    GameObject camera = GameObject.Find("Main Camera");
    constrain(camera.gameObject,true); //if you are constraining the camera object

    GameObject player= GameObject.Find("Player");
    constrain(player.gameObject); //skip the optional parameter if not referencing the camera

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

Я изменил положение Z камеры во время выполнения, и если я переместил ее в отрицательное положение Z, я смогу увидеть все игровые объекты.

Вот скриншот игрыбез перемещения камеры: enter image description here

И еще после того, как я переместил камеру в положение -1 Z: enter image description here

Мой вопросКороче говоря, это ...

Когда я оставляю свою камеру в покое и не ограничиваю ее, она работает нормально.Как только я ограничиваю это, это начинает становиться сумасшедшим.Если я ограничу его и переместу в отрицательную позицию Z, это сработает.

Может кто-нибудь пролить свет на то, почему это может происходить?Является ли первая более сложная функция, которую я разместил над самым гладким решением, или у кого-нибудь есть советы, как улучшить мой код?

Любой совет будет принят с благодарностью

ОБНОВЛЕНИЕ Было предложено попробовать разместить мои объекты на отдельных слоях сортировки.Я пытался это, но это не похоже на работу.Если нет способа переместить камеру на другой слой сортировки, я не уверен, что это решение ...

Вот скриншот того, что я сделал на тот случай, если допустил ошибку: enter image description here

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

представьте, что вы смотрите на свой игровой объект, на самом деле есть два из них, A и B

A                 z=1
    B                z=0 


  V 

- это ваша камера, обратите внимание на угол v?это твой видобратите внимание, если бы вы смотрели на камеру a и b, они оба были бы на месте (z = -3)

A V
    B 

- теперь обратите внимание, что камера находится в нулевом положении, все ваши объекты находятся рядом илиза ним, и, следовательно, ничего не показывает на экране.это называется перспективой.чем дальше назад камера, тем шире ее линия сайта и больше объектов в поле зрения

0 голосов
/ 10 октября 2018

TL;DR

Так работает камера в Unity.


Более длинная версия:

Когда камера находится в положении 0 z, даже в ортографическом режиме она просто равна объектам, поэтому она не может «видеть» объект в одной плоскости.Если вы работаете с 2D-игрой (не 2,5D), вы должны использовать Сортировка слоев , чтобы создать хорошую иерархию объектов.

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