Rat Smasher · Керування

Як працює джойстик і рух меча

Не переказ, а показ. Тягни мишею або пальцем по кожній арені — усі демо працюють на тому ж алгоритмі й тих самих числах, що в грі (SmashPlayer.cs + GameConfig.asset). Скрізь є цілі-манекени — вони підсвічуються, коли потрапляють у зону удару меча (їх не б'є й не руйнує, це лише для прицілювання).

★ Прототипи керування — порівняй

01Дві схеми поруч

Погравши обома, легко відчути різницю. Золотий пунктир навколо меча — зона удару (база ≈ 1 одиниця). Манекени золотіють, коли в неї потрапляють. Лічильник «у зоні» — угорі кожної арени.

Джойстик (поточний)

Відносне перетягування: де торкнувся — там якір, меч їде пропорційно зсуву. З інерцією.

Стан
спокій
Цілей у зоні
0
Чутливість SwordDragSensitivityгра: 2
ІнерціяON · damping 9
ЯкоріON
Сильне: палець не закриває меч, підсилена досяжність, безперервне ухиляння. Моя оцінка: найкраще для гри про доджі.

Tap to move + hold to drag прототип

Короткий тап — меч їде в точку. Затиснув і тягнеш — меч іде під пальцем (абсолютно).

Стан
спокій
Цілей у зоні
0
Швидкість тап-руху14
Проблеми, які відчуєш: у режимі drag палець закриває меч і ціль під ним; тап — це стрибки по точках, а не плавні доджі; абсолютний рух прибирає підсилену досяжність. Моя оцінка: як заміна — крок назад для цього жанру.
Що спробувати
В обох аренах веди меч так, щоб золотити манекени, і одночасно «ухиляйся». У джойстику це виходить безперервно й наосліп; у tap-to-move ти або втрачаєш ціль під пальцем (drag), або смикаєшся стрибками (tap). Це і є суть мого фідбеку в чаті.

02Відносне перетягування (якорі)

У мить дотику гра запам'ятовує дві точки: де стоїть палець (червоний якір) і де стоїть меч (зелений якір). Далі щокадру:
меч = якір_меча + (палець − якір_пальця) × чутливість.

Ключове: це рахується від якоря щокадру, а не накопичується. Тому немає дрейфу й «мертвої зони»: упреш меч у край — він там стоїть; потягнув назад — одразу їде. Кожен новий дотик ставить якорі заново, тож меч ніколи не «стрибає» до пальця.

Тягни — червоний і зелений якорі показують, від чого рахується зсув. Манекени золотіють у зоні удару.

якір пальця якір меча меч ціль у зоні ціль поза зоною
Приклад
Меч у центрі, торкнувся внизу й повів угору — меч поїхав угору від центру, а не стрибнув до пальця. Відпустив, торкнувся деінде — нові якорі, знову без стрибка.

03Чутливість — головний важіль

SwordDragSensitivity — скільки одиниць проходить меч на одну одиницю зсуву пальця. У грі стоїть 2 (у коді дефолт 1.5, але ассет перекриває на 2). Більше за 1 — підсилення: маленький свайп = великий шлях меча.

Тягни. Фіолетовий — реальний меч. Блідий привид — де був би меч при чутливості . Дивись, як легко дістаєш манекени по кутах при вищій чутливості.

Чутливість2.0 гра: 2
меч (обрана чутливість) привид (1×) ціль у зоні
Приклад
При 1 меч точно повторює палець. При 2 — вдвічі далі: та сама арена долається вдвічі меншим рухом руки. При 4 стає нервово: ледь смикнув — меч уже в кутку.

04Інерція — ковзання після відпускання

Коли прибираєш палець, меч не завмирає намертво. Він продовжує їхати з останньою швидкістю й плавно гальмує:

Різко смикни й відпусти — меч докотиться сам. Смуга показує залишкову швидкість. Постав damping 0, щоб відчути «сухий» рух (моє питання №2 у чаті).

Залишкова швидкість
0.00
GlideDamping9
Стан
спокій
Цілей у зоні
0
Приклад
damping 0 — меч завмирає в мить відпускання (точніше, але «роботизовано»). 9 — рух живий, з докочуванням, але може трохи проскочити ціль/під атаку.

05Межі арени й відступ від краю

Меч не виходить за арену. Прямокутник у грі підганяється під камеру (FitToCamera). Плюс SpawnMargin = 0.5: відступ по краю (сіра смуга), за який меч не заходить.

Тягни в кут і далі — меч упреться в межу (стане червоним) і паркується. Манекени по кутах допомагають відчути досяжність краю.

SpawnMargin межа активна ціль у зоні
Приклад
Гоніш палець за екран — меч стоїть на межі, не «тікає». Оскільки зсув від якоря, трохи назад — і меч одразу відліплюється від краю.

06Кільце джойстика — це косметика

Кільце з кнобом — декорація. Меч читає «сирий» зсув пальця, а НЕ згладжену позицію кноба. Тому налаштування вигляду джойстика не змінюють керування.

Кноб: тримається в межах maxKnobRadius = 100px і пружинить до пальця зі швидкістю knobFollow = 22.

Крути різко по колу: кноб трохи відстає й обмежений радіусом — а меч (і його зона удару на манекенах) реагує миттєво.

меч — сирий палець кноб — згладжений кільце (100px) ціль у зоні
Приклад
Швидке коло пальцем: кноб малює менше, «ліниве» коло, а меч точно повторює руку по всій арені. Гравець керує мечем — кільце лише підказує, де палець.

07Апгрейди змінюють швидкість наживо

Чутливість не завжди 2 під час гри. Реальне значення:

ефект = 2 × (1 + MoveSpeedPct) × (1 + AllStatsPct)

MoveSpeedPct — з вузлів швидкості. AllStatsPct — вузол «Insight». Додаються наживо: купив вузол посеред сесії — діє з наступного перетягування.

Вмикай апгрейди — дивись, як росте формула й досяжність.

+20%швидкість
+50%швидкість
+25%Insight
MoveSpeedPct (сума)
0%
AllStatsPct (Insight)
0%
Ефективна чутливість
2.00
Приріст досяжності
+0%
Приклад
+50% швидкості й +25% Insight: 2 × 1.5 × 1.25 = 3.75. Той самий свайп несе меч майже вдвічі далі — гравець стає «слизьким».

08Усі параметри — одним поглядом

ПараметрЩо робитьЗначенняДе заданий
SwordDragSensitivityОд. руху меча на од. зсуву пальця. Головний важіль швидкості.2GameConfig.asset
(перекриває дефолт 1.5)
SwordGlideDampingШвидкість згасання ковзання (за сек). 0 = вимкнено.9GameConfig.asset
SwordGlideMinSpeedШвидкість, нижче якої меч паркується.0.6GameConfig.asset
GlideVelocitySmoothingЯк швидко відстежувана швидкість наздоганяє реальну. Не GD-важіль.20SmashPlayer.cs
const
зона удару (база)Радіус, у якому меч «дістає» ворогів (для прицілювання в демо).≈1 од.CombatManager
BaseCircleRadius 28 / 28 = 1
WorldRectПрямокутник арени. Задано 8×12, наживо підганяється під камеру.fit-to-cameraGameArea.asset + GameManager
SpawnMarginВідступ по кожному краю.0.5GameArea.asset
maxKnobRadius / knobFollowРадіус і пружність кноба (косметика).100px / 22JoystickView.cs
дефолти коду
ефект. чутливістьБазова × апгрейди руху.2×(1+move)×(1+insight)SmashPlayer.cs
наживо
✓ Факти (з коду та ассетів)
  • Значення зчитані з GameConfig.asset, GameArea.asset, SmashPlayer.cs, JoystickView.cs, CombatManager.cs.
  • Алгоритм джойстика в демо — точна копія SmashPlayer.Update()/Glide().
  • Базова зона удару нормалізується до ≈1 світ. одиниці (BaseCircleRadius 28 / 28).
  • Кноб справді косметичний — меч читає сирий зсув пальця (коментар у коді).
≈ Припущення
  • «Tap to move + hold to drag» — це мій прототип поведінки для порівняння, а НЕ наявний код гри. Пороги (тап <180мс / зсув <0.35 од.) обрані для відчуття, не з ГДД.
  • Манекени статичні й не рухаються/не б'ються — це лише індикатор прицілювання, не бойова модель.
  • «Швидко долається рівень» — наслідок чутливості 2 + малої арени під камеру. Реальний час не заміряний.
✗ Чого бракує
  • Значення JoystickView — дефолти коду; префаб міг перекрити. Не відкривав префаб.
  • Точні % вузлів MoveSpeedPct не знайдено в Assets/Data (ймовірно Google Sheet / BakingSheet).
  • Зона удару в демо — базова (≈1). Реальна множиться на зброю/апгрейди/благословення — тут не враховано.