| 12345678910111213141516171819202122232425262728293031323334353637 | using System.Threading.Tasks;using UnityEngine.UIElements;namespace Edgegap.Editor{    /// <summary>Slightly shake a UI button to indicate attention.</summary>    public class ButtonShaker    {        const string SHAKE_START_CLASS = "shakeStart";        const string SHAKE_STOP_CLASS = "shakeEnd";        private Button targetButton;        public ButtonShaker(Button buttonToShake) =>            targetButton = buttonToShake;        /// <summary>Shake the button x times for x msDelayBetweenShakes each.        /// 1 shake = 1 bigger -> followed by 1 smaller.</summary>        /// <param name="msDelayBetweenShakes"></param>        /// <param name="iterations"># of shakes</param>        public async Task ApplyShakeAsync(int msDelayBetweenShakes = 40, int iterations = 2)        {            for (int i = 0; i < iterations; i++)                await shakeOnce(msDelayBetweenShakes);        }        private async Task shakeOnce(int msDelayBetweenShakes)        {            targetButton.AddToClassList(SHAKE_START_CLASS);            await Task.Delay(msDelayBetweenShakes); // duration of the first transition            targetButton.RemoveFromClassList(SHAKE_START_CLASS);                        targetButton.AddToClassList(SHAKE_STOP_CLASS);            await Task.Delay(msDelayBetweenShakes); // duration of the second transition            targetButton.RemoveFromClassList(SHAKE_STOP_CLASS);        }    }}
 |