All tools
DOTweenUIFeedback
Button Feel Lab
Tune press, hover and reject feedback, then paste it into Unity.
StateNormal
Stage
Motion tracescalex
Release easeOutBack
Click stream
- Press the button — accepted and rejected clicks land here.
Parameters
// Generated by Button Feel Lab — burakkaan.dev/tools/button-feel-lab
// Call from an Editor script or a bootstrap to build the profile.
using DG.Tweening;
using UnityEngine;
using Game.UI;
public static class GeneratedButtonFeel
{
public static void Apply(ButtonFeedbackConfig c)
{
c.NormalScale = Vector3.one;
c.NormalColor = new Color(0.031f, 0.569f, 0.698f, 1.000f);
c.HighlightEnabled = true;
c.HighlightScaleMultiplier = 1.050f;
c.HighlightColor = new Color(0.024f, 0.714f, 0.831f, 1.000f);
c.HighlightDuration = 0.120f;
c.HighlightEase = Ease.OutQuad;
c.PressedScaleMultiplier = 0.920f;
c.PressedColor = new Color(0.055f, 0.455f, 0.565f, 1.000f);
c.PressedDuration = 0.070f;
c.PressedEase = Ease.OutQuad;
c.ReleaseDuration = 0.220f;
c.ReleaseEase = Ease.OutBack;
c.ClickPunchStrength = 0.100f;
c.ClickPunchDuration = 0.200f;
c.ClickPunchVibrato = 8;
c.ClickPunchElasticity = 0.600f;
c.RejectShakeEnabled = true;
c.RejectShakeStrength = 14.000f;
c.RejectShakeDuration = 0.320f;
c.RejectShakeVibrato = 14;
c.RejectShakeRandomness = 60.000f;
c.DisabledColor = new Color(0.031f, 0.569f, 0.698f, 0.400f);
c.DisabledDuration = 0.150f;
c.UseUnscaledTime = true;
c.ClickCooldown = 0.120f;
c.SfxVolume = 1.000f;
#if UNITY_EDITOR
UnityEditor.EditorUtility.SetDirty(c);
#endif
}
}Ease names map 1:1 onto DOTween's Ease enum, so this compiles as-is against the config in the last tab.
What the numbers mean
Press → release
290 ms
Full round trip. Over ~350 ms starts to feel laggy.
Max clicks / s
8.3
Cooldown gate. Keep above your fastest legitimate tap rate.
Punch peak
10%
Scale overshoot on click, on top of the press scale.
Shake travel
14 px
Peak horizontal offset when a click is refused.
The stage runs the same state machine Unity's Selectable does — pointer enter/exit/down/up in the same order, with cooldown and busy gates in front of the click. What you feel here is what you get in-engine, minus input latency.