Масштабируемый элемент пользовательского интерфейса Unity на основе близости к цели?

#c# #user-interface #unity3d

#c# #пользовательский интерфейс #unity3d

Вопрос:

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

введите описание изображения здесь

Я хочу, чтобы элемент, который «выбран», или любой другой элемент, который находится ближе всего к цели, масштабировался, например, приложения Apple Watch:

введите описание изображения здесь

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

 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, и вы хотите достичь размера 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);
  

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