Добрый день всем
Я работаю над базовой 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](https://i.stack.imgur.com/K2b7v.jpg)
И еще после того, как я переместил камеру в положение -1 Z: ![enter image description here](https://i.stack.imgur.com/la3V4.jpg)
Мой вопросКороче говоря, это ...
Когда я оставляю свою камеру в покое и не ограничиваю ее, она работает нормально.Как только я ограничиваю это, это начинает становиться сумасшедшим.Если я ограничу его и переместу в отрицательную позицию Z, это сработает.
Может кто-нибудь пролить свет на то, почему это может происходить?Является ли первая более сложная функция, которую я разместил над самым гладким решением, или у кого-нибудь есть советы, как улучшить мой код?
Любой совет будет принят с благодарностью
ОБНОВЛЕНИЕ Было предложено попробовать разместить мои объекты на отдельных слоях сортировки.Я пытался это, но это не похоже на работу.Если нет способа переместить камеру на другой слой сортировки, я не уверен, что это решение ...
Вот скриншот того, что я сделал на тот случай, если допустил ошибку: