ScrollRect

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

Использовала для этого verticalNormalizedPosition. Написано, мол, принимает значения от 0 до 1. В общем, ни одна формула подсчета не сложилась, и я в тупую начала туда вбивать 0, 0.5, 1 - и НИЧЕГО. Оно совершенно никак не меняется.

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

Кто-то сталкивался? Может, есть какие-то другие пути выставления позиции скроллера?

https://docs.unity3d.com/Packages/com.unity.ugui@1.0/manual/script-ScrollRect.html
По ссылке от гугла объясняют следующее:

Details
The important elements in a scroll view are the viewport, the scrolling content, and optionally one or two scrollbars.
The root GameObject has the Scroll Rect component.
The viewport has a Mask component. The viewport can either be the root GameObject, or a separate GameObject that’s a child to the root. If auto-hiding scrollbars are used, it must be a child. The viewport Rect Transform needs to be referenced in the Viewport property of the Scroll Rect.
All the scrolling content must be children of a single content GameObject that is a child to the viewport. The content Rect Transform needs to be referenced in the Content property of the Scroll Rect.
The scrollbars - if used - are children to the root GameObject. See the Scrollbar page for more details on the setup of a scrollbar and see the section Scrollbar setup below for information about setup of scrollbars with a scroll view.

P. S.
Там-же по ссылке говорят что свойство Direction для Scroll Rect должно быть установлено: по x- слева направо, а по y- снизу вверх.
Возможно в этом загвоздка?
А здесь подсказывают что нужно запросить обработчик прокрутки.

Спасибо, статья помогла.
В частности вот это

StartCoroutine(locateFirst());​
}

IEnumerator locateFirst()
{
yield return new WaitForSeconds(0.5f);
ScrollRect sr = _content.parent.GetComponent<ScrollRect>();
sr.verticalNormalizedPosition = 1.0f;​
}

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

Что касается проблемы у автора этого кода, что из-за

yield return new WaitForSeconds(0.5f);

скролл прокручивался после открытия окна и было некрасиво, то я сделала

yield return null;

А выполнение корутины на onEnable окна. И все отлично работает.

Теперь проблема в другом. Есть два окна, в котором надо показывать эту шнягу. У меня есть префаб, в котором, собственно и находится этот скролл вместе с сопутствующими скриптами и данными. Но в одном окне высота вьюпорта 1200 пикселей, а в другом - 800. Соответственно, чтобы красиво показывалась текущей, к примеру, вторая локация, у первого окна verticalNormalizedPosition должен быть 0.2, а у второго - 0.25. А считается все почему-то одинаково 0.2. И только в одном окне все выглядит нормально.

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

UPD: пофиксила. Сделала одинаковым размером, но поменяла одному из них скейл. Теперь у них одинаковые verticalNormalizedPosition .

1 лайк