Unity - масштабируемый элемент пользовательского интерфейса, основанный на близости к цели? - PullRequest
0 голосов
/ 27 марта 2019

Хорошо, я использую всенаправленную прокрутку https://bitbucket.org/beksomega/unityuiscrollsnaps/src, и у меня есть эта настройка, где ящики привязываются к центру фиолетового ящика с перетаскиванием:

enter image description here

Я хочу, чтобы элемент, который "выбран" или какой-либо элемент был ближе к цели, увеличивался, как приложения для часов Apple:

enter image description here

В скриптах у меня много функций, подобных этой:

private Vector2 FindClosestSnapPositionToPosition(Vector2 position)
        {
            EnsureLayoutHasRebuilt();

            Vector2 selected = Vector2.zero;
            float shortestDistance = Mathf.Infinity;

            foreach (Vector2 snapPosition in m_SnapPositions)
            {
                float distance = Vector2.Distance(snapPosition, position);

                if (distance < shortestDistance)
                {
                    shortestDistance = distance;
                    selected = snapPosition;
                }
            }

            return selected;
        }

, и я могу распечатать выбранный или ближайший элемент.Как я могу масштабироваться в соответствии с близостью к цели?

1 Ответ

1 голос
/ 28 марта 2019

Я понимаю, что вы хотите масштабировать между некоторыми границами.Допустим, он начинается в масштабе 1, а вы хотите достичь размера S. Мы можем определить расстояние D, относительное между указателем и объектом, где объект начинает масштабироваться.Вы можете сделать что-то вроде этого.

/* Constants */
const float S = 2.0f; // The maximum size you want to get when closest
const float D = 5.0f; // The distance where you start to scale
const float E = 1.0f; // The distance where the object will not scale more (i.e. reached the maximum)

float GetIconSize(Vector2 pointer, Vector2 icon)
{
    // Get the value between 0 and 1 from the distance between
    float factor = Mathf.InverseLerp(D, E, Vector2.Distance(pointer, icon));

    // Return the interpolated value size depending on the distance
    return Mathf.Lerp(1.0f, S, factor);
}

И затем применить к объекту (я предполагаю, что это называется «иконка»)

float size = GetIconSize(Vector2 pointer, Vector2 icon);
icon.transform.localScale = new Vector2(size, size);

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

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