Написал простенькую механику вращения колеса фортуны и столкнулся с проблемой что в окне едитора оно вращается хорошо а в собранном apk на емуляторе и на физ устройстве - с визуальными недочетами.
Вот видео:
Механика состоит из двух частей:
1) Вращение колеса за пальцем пользователя до момента пока он не отпустил палец.
2) Вращение колеса уже после того как пользователь отпустил палец с учетом инерции.
У меня проблемы с тем, что бы на всех устройствах переход между этими 2-я этапами вращения колеса визуально не был заметен.
То есть во втором этапе начальная скорость вращения должна соответствовать скорости с которой вращалось колесо во время первого этапа с последующим плавным замедлением.
Тот результат, который я вижу в окне юнити приемлим. Если бы только так же работало везде.
Вот так я вращаю колесо до его запуска (без инерции):
Синтаксис:
Используется csharp
private void OnMouseDrag()
{
if (isRolling) return;
float rotY = Input.GetAxis("Mouse Y") * 0.05f * Mathf.Rad2Deg;
transform.Rotate(transform.up, rotY, Space.World);
}
{
if (isRolling) return;
float rotY = Input.GetAxis("Mouse Y") * 0.05f * Mathf.Rad2Deg;
transform.Rotate(transform.up, rotY, Space.World);
}
Вот так я рассчитываю скорость, с которой колесо будет вращатся когда пользователь отпустил палец:
Синтаксис:
Используется csharp
private void OnMouseDown()
{
mouseHoldTime = Time.time;
mouseHoldPos = Input.mousePosition;
}
private void OnMouseUp()
{
float totalTime = Time.time - mouseHoldTime;
float totalDist = Vector2.Distance(mouseHoldPos, Input.mousePosition);
var dir = ((mouseHoldPos.y - Input.mousePosition.y) < 0) ? WheelDirection.Up : WheelDirection.Down;
float totalSpeed = totalDist / totalTime;
//500 это вручную подогнанная величина для более приятного визуального эффекта
StartWheelRotation((totalSpeed / 500), dir);
mouseHoldTime = 0.0f;
mouseHoldPos = Vector2.zero;
}
{
mouseHoldTime = Time.time;
mouseHoldPos = Input.mousePosition;
}
private void OnMouseUp()
{
float totalTime = Time.time - mouseHoldTime;
float totalDist = Vector2.Distance(mouseHoldPos, Input.mousePosition);
var dir = ((mouseHoldPos.y - Input.mousePosition.y) < 0) ? WheelDirection.Up : WheelDirection.Down;
float totalSpeed = totalDist / totalTime;
//500 это вручную подогнанная величина для более приятного визуального эффекта
StartWheelRotation((totalSpeed / 500), dir);
mouseHoldTime = 0.0f;
mouseHoldPos = Vector2.zero;
}