Реалізація віртуального джойстика для мобільної гри
Віртуальний джойстик здається простим до першого плей-тесту. Вісім рядків коду на Input.GetTouch та Vector2.Normalize працюють на пристрої розробника. На телефоні з діагоналлю 5.4" у ландшафтній орієнтації великий палець перекриває зону джойстика, і гравець втрачає орієнтир положення.
Ключові параметри реалізації
Фіксований vs плаваючий джойстик. Фіксований—центр завжди в одній точці екрана. Плаваючий—центр з'являється там, де гравець першим дотикнувся. Для шутерів та action-ігр плаваючий привабливіший: він адаптується до хвату. Але у нього своя проблема—якщо зона активації занадто велика, джойстик може з'явитися при випадковому дотику інтерфейсу.
В Unity реалізуйте через RectTransform у Canvas з ScreenSpace - Overlay. Центр джойстика — backgroundRect.anchoredPosition, нипло — knobRect.anchoredPosition. Розрахунок напрямку:
Vector2 delta = touchPosition - joystickCenter;
float distance = delta.magnitude;
Vector2 direction = delta / Mathf.Max(distance, radius); // нормалізація з урахуванням радіусу
knobRect.anchoredPosition = direction * Mathf.Min(distance, radius);
inputDirection = direction; // [-1,1] по кожній осі
Мертва зона. Без мертвої зони персонаж дергається від випадкових мікро-рухів пальця. Зазвичай 0.15–0.2 від радіусу—залежить від гри. У гоночних іграх мертва зона менша, у стратегіях—більша.
Чутливе відчуття
Гладкість—через Vector2.Lerp або Vector2.MoveTowards при оновленні позиції нипла:
knobRect.anchoredPosition = Vector2.Lerp(
knobRect.anchoredPosition,
targetKnobPos,
Time.deltaTime * followSpeed
);
followSpeed 15–25 дає інерцію, яка відчувається як «фізична». При followSpeed > 40 інерція зникає, нипло рухається миттєво—підходить для стрілялок, не для платформерів.
На Godot 4 аналогічно: Control нода з кастомним _draw() для фону та нипла, оновлення через _input(event) при InputEventScreenDrag.
Мультитач
Джойстик руху та джойстик прицілювання—два незалежні об'єкти. Кожен фіксує fingerId свого дотику при TouchPhase.Began та обробляє тільки события з цим fingerId. Без цього швидке зняття одного пальця та повторний дотик до іншої зони екрана може передати керування не тому джойстику.
Інтеграція: 2–3 дні. Вартість розраховується індивідуально.







