#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);
Функции вы должны передать положение вашего указателя, мыши, пальца и т.д., А второй параметр — это значок или цель, которую вы хотите масштабировать.
В принципе, вам нужно знать коэффициент расстояния между обоими и с этим коэффициентом интерполировать между минимальным и максимальным масштабами.
Я надеюсь, это то, что вы хотели, а если нет, скажите мне.