Подтвердить что ты не робот

Unity 4.3 - понимание позиций и разрешения экрана, как правильно установить положение объекта?

Использование Unity 4.3 в режиме 2d У меня есть GameObject, который является спрайтом (в SpriteRenderer, который я установил спрайт), и я пытаюсь поместить его в верхнем левом углу экрана.

Я бы хотел, чтобы этот спрайт располагался в левом верхнем углу (например) в каждом разрешении (у меня есть iOS как цель сборки, так что в моем случае я говорю об iPhone со всеми разрешениями, сетчаткой, без сетчатки, iPad и т.д.).

Что мне не хватает, как работает система координат, я привык работать с пикселями в системе координат, где 0,0 начинаются с нижнего левого или верхнего левого.

Здесь, в Unity 4.3, похоже, что 0,0 находится в центре (это явно не большая проблема), но то, что меня смущает, заключается в том, что если я печатаю ширину моего объекта (который составляет 128 пикселей), я получаю 1.06 в качестве значения, а также экран подразделяется на "точки", я полагаю, поэтому левый -3, а правый - +3

так что вопросы: Почему моя ширина спрайта составляет 1,06? Как я должен позиционировать вещи в этой системе?

Представьте себе, что я хочу поместить квадрат 128px * 128px точно в верхнем левом углу, как я могу это сделать?

4b9b3361

Ответ 1

Первое, что вы, возможно, захотите заметить, это то, что при импорте изображения в единство как Texture Type = Sprite существует атрибут "Pixels To Units", который вы увидите в активе спрайта.

enter image description here

Таким образом, ваш 128px, если оставить его по умолчанию, будет 1,28 "Units" wide. Однако это значение не соответствует вашим мерам 1.06, поэтому я не уверен, откуда это взялось. Это может быть из-за того, что масштаб вашего объекта спрайта не является однородным, или это может быть связано с изменением настроек "Пиксели к единицам". Дважды проверьте инспектор, что ваша текстура ввода на самом деле равна 128x128, а также проверьте, что значение Pixel to Units - это то, что вы ожидаете.

Затем обратите внимание, что "Размер" орфографической камеры соответствует половине ее высоты.

Итак, на рисунке ниже орто-камера увидит область в белом прямоугольнике. Размер 5, означает 10 единиц. Картина цветка, который у меня на сцене, имеет изображение шириной 128 пикселей на 96 пикселей, импортированное по умолчанию (1 единица = 100 пикселей).

enter image description here

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

// Update is called once per frame
void Update () {
    float camHalfHeight = Camera.main.orthographicSize;
    float camHalfWidth = Camera.main.aspect * camHalfHeight; 

    Bounds bounds = GetComponent<SpriteRenderer>().bounds;

    // Set a new vector to the top left of the scene 
    Vector3 topLeftPosition = new Vector3(-camHalfWidth, camHalfHeight, 0) + Camera.main.transform.position; 

    // Offset it by the size of the object 
    topLeftPosition += new Vector3(bounds.size.x / 2,-bounds.size.y / 2, 0);

    transform.position = topLeftPosition;        
}