Skip to content

Commit

Permalink
- Remove predefined patterns vibration on Android because it sucks
Browse files Browse the repository at this point in the history
  • Loading branch information
lamnd committed Oct 14, 2024
1 parent 13cd11c commit 681c9fa
Show file tree
Hide file tree
Showing 6 changed files with 21 additions and 163 deletions.
68 changes: 3 additions & 65 deletions Modules/Vibration/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
Native plugin for Unity for iOS and Android.
Use custom vibrations on mobile.

Origin github repository: "https://github.com/BenoitFreslon/Vibration"
Reference: "https://github.com/BenoitFreslon/Vibration", "https://gist.github.com/ruzrobert/d98220a3b7f71ccc90403e041967c46b"

# Use

Expand All @@ -15,70 +15,8 @@ Initialize the plugin with this line before using vibrations:

## Vibrations

### iOS and Android

#### Default vibration

Use `Vibration.Vibrate();` for a classic default ~400ms vibration

#### Pop vibration

Pop vibration: weak boom (For iOS: only available with the haptic engine. iPhone 6s minimum or Android)

`Vibration.VibratePop();`

#### Peek Vibration

Peek vibration: strong boom (For iOS: only available on iOS with the haptic engine. iPhone 6s minimum or Android)

`Vibration.VibratePeek();`

#### Nope Vibration

Nope vibration: series of three weak booms (For iOS: only available with the haptic engine. iPhone 6s minimum or Android)

`Vibration.VibrateNope();`
Just call `Vibration.Vibrate(VibrationType type);`

## Enable/Disable

Set `Vibration.Enable` to true or false.

---
## Android Only

#### Custom duration in milliseconds

`Vibration.Vibrate(500);`

#### Pattern

```
long [] pattern = { 0, 1000, 1000, 1000, 1000 };
Vibration.Vibrate ( pattern, -1 );
```

#### Cancel

`Vibration.Cancel();`

---
## IOS only
vibration using haptic engine

`Vibration.VibrateIOS(ImpactFeedbackStyle.Light);`

`Vibration.VibrateIOS(ImpactFeedbackStyle.Medium);`

`Vibration.VibrateIOS(ImpactFeedbackStyle.Heavy);`

`Vibration.VibrateIOS(ImpactFeedbackStyle.Rigid);`

`Vibration.VibrateIOS(ImpactFeedbackStyle.Soft);`

`Vibration.VibrateIOS(NotificationFeedbackStyle.Error);`

`Vibration.VibrateIOS(NotificationFeedbackStyle.Success);`

`Vibration.VibrateIOS(NotificationFeedbackStyle.Warning);`

`Vibration.VibrateIOS_SelectionChanged();`
Set `Vibration.Enable` to true or false.
11 changes: 8 additions & 3 deletions Modules/Vibration/Vibration.cs
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
using UnityEngine;

namespace LFramework.Vibration
namespace LFramework.Vibration
{
public static class Vibration
{
public static bool Enabled = true;

public static void Init()
{
#if UNITY_ANDROID
VibrationAndroid.Init();
#endif
}

public static void Vibrate(VibrationType type)
{
#if UNITY_IOS
Expand Down
80 changes: 9 additions & 71 deletions Modules/Vibration/VibrationAndroid.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,18 +42,14 @@ public static class VibrationAndroid
// Available only from Api >= 26
private static bool _isSupportVibrationEffect { get { return _apiLevel >= 26; } }

// Available only from Api >= 29
private static bool _isSupportPredefinedEffect { get { return _apiLevel >= 29; } }

#region Initialization

[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
private static void Initialize()
public static void Init()
{
if (_isInitialized)
return;

if (Application.isEditor)
if (Application.platform != RuntimePlatform.Android)
return;

// Get Api Level
Expand All @@ -76,22 +72,13 @@ private static void Initialize()
_vibrationEffectClass = new AndroidJavaClass("android.os.VibrationEffect");
_defaultAmplitude = Mathf.Clamp(_vibrationEffectClass.GetStatic<int>("DEFAULT_AMPLITUDE"), 1, 255);
}

// If device supports predefined effects, get their IDs
if (_isSupportPredefinedEffect)
{
PredefinedEffect.CLICK = _vibrationEffectClass.GetStatic<int>("EFFECT_CLICK");
PredefinedEffect.DOUBLE_CLICK = _vibrationEffectClass.GetStatic<int>("EFFECT_DOUBLE_CLICK");
PredefinedEffect.HEAVY_CLICK = _vibrationEffectClass.GetStatic<int>("EFFECT_HEAVY_CLICK");
PredefinedEffect.TICK = _vibrationEffectClass.GetStatic<int>("EFFECT_TICK");
}
}
}

LDebug.Log(typeof(VibrationAndroid), $"Initialized" +
$"\nDevice has Vibrator = {HasVibrator()}" +
$"\nDevice support Amplitude Control = {HasAmplitudeControl()}" +
$"\nDevice support Predefined Effects = {_isSupportPredefinedEffect}");
$"\nDefault amplitude = {_defaultAmplitude}");

_isInitialized = true;
}
Expand All @@ -112,7 +99,6 @@ public static void Vibrate(VibrationType type)
Vibrate(_lightDuration, _lightAmplitude);
break;

case VibrationType.Rigid:
case VibrationType.ImpactMedium:
Vibrate(_mediumDuration, _mediumAmplitude);
break;
Expand All @@ -133,24 +119,8 @@ public static void Vibrate(VibrationType type)
Vibrate(_warningPattern, _warningPatternAmplitude);
break;

case VibrationType.Tick:
Vibrate(PredefinedEffect.TICK);
break;

case VibrationType.ClickSingle:
Vibrate(PredefinedEffect.CLICK);
break;

case VibrationType.ClickDouble:
Vibrate(PredefinedEffect.DOUBLE_CLICK);
break;

case VibrationType.ClickHeavy:
Vibrate(PredefinedEffect.HEAVY_CLICK);
break;

default:
LDebug.Log(typeof(VibrationAndroid), $"Undefined vibrate type {type}");
LDebug.Log(typeof(VibrationAndroid), $"Undefined vibration type {type}");
break;
}
}
Expand All @@ -160,10 +130,10 @@ public static void Vibrate(VibrationType type)
/// If amplitude is -1, amplitude is Disabled. If -1, device DefaultAmplitude is used. Otherwise, values between 1-255 are allowed.
/// If 'cancel' is true, Cancel() will be called automatically.
/// </summary>
public static void Vibrate(long milliseconds, int amplitude = -1, bool cancel = false)
public static void Vibrate(long milliseconds, int amplitude = 0, bool cancel = false)
{
// Lazy initialize
Initialize();
Init();

if (!HasVibrator())
return;
Expand All @@ -176,17 +146,14 @@ public static void Vibrate(long milliseconds, int amplitude = -1, bool cancel =
// Validate amplitude
amplitude = Mathf.Clamp(amplitude, -1, 255);

// If -1, disable amplitude (use maximum amplitude)
if (amplitude == -1)
// If less -1 or don't have amplitude control, disable amplitude (use maximum amplitude)
if (amplitude <= -1 || !HasAmplitudeControl())
amplitude = 255;

// If 0, use device DefaultAmplitude
if (amplitude == 0)
amplitude = _defaultAmplitude;

// If amplitude is not supported, use 255; if amplitude is -1, use systems DefaultAmplitude. Otherwise use user-defined value.
amplitude = !HasAmplitudeControl() ? 255 : amplitude;

VibrateEffect(milliseconds, amplitude);
}
else
Expand All @@ -204,7 +171,7 @@ public static void Vibrate(long milliseconds, int amplitude = -1, bool cancel =
public static void Vibrate(long[] pattern, int[] amplitudes = null, int repeat = -1, bool cancel = false)
{
// Lazy initialize
Initialize();
Init();

if (!HasVibrator())
return;
Expand Down Expand Up @@ -240,27 +207,6 @@ public static void Vibrate(long[] pattern, int[] amplitudes = null, int repeat =
}
}

/// <summary>
/// Vibrate predefined effect (described in Vibration.PredefinedEffect). Available from Api Level >= 29.
/// If 'cancel' is true, Cancel() will be called automatically.
/// </summary>
public static void VibratePredefined(int effectId, bool cancel = false)
{
// Lazy initialize
Initialize();

if (!HasVibrator())
return;

if (!_isSupportPredefinedEffect)
return;

if (cancel)
Cancel();

VibrateEffectPredefined(effectId);
}

/// <summary>
/// Returns true if device has vibrator
/// </summary>
Expand Down Expand Up @@ -376,14 +322,6 @@ private static void ClampAmplitudesArray(int[] amplitudes)
}

#endregion

public static class PredefinedEffect
{
public static int CLICK;
public static int DOUBLE_CLICK;
public static int HEAVY_CLICK;
public static int TICK;
}
}
}

Expand Down
12 changes: 0 additions & 12 deletions Modules/Vibration/VibrationIOS.cs
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,6 @@ public static void Vibrate(VibrationType type)
Handheld.Vibrate();
break;

case VibrationType.Tick:
case VibrationType.ImpactLight:
Vibrate(ImpactFeedbackStyle.Light);
break;
Expand All @@ -107,21 +106,10 @@ public static void Vibrate(VibrationType type)
Vibrate(ImpactFeedbackStyle.Medium);
break;

case VibrationType.ClickHeavy:
case VibrationType.ImpactHeavy:
Vibrate(ImpactFeedbackStyle.Heavy);
break;

case VibrationType.ClickDouble:
case VibrationType.Rigid:
Vibrate(ImpactFeedbackStyle.Rigid);
break;

case VibrationType.ClickSingle:
case VibrationType.Soft:
Vibrate(ImpactFeedbackStyle.Soft);
break;

case VibrationType.Success:
Vibrate(NotificationFeedbackStyle.Success);
break;
Expand Down
11 changes: 0 additions & 11 deletions Modules/Vibration/VibrationType.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,16 +12,5 @@ public enum VibrationType
Success,
Failure,
Warning,

// iOS
Rigid,
Soft,

// Android predefined patterns
ClickSingle,
ClickDouble,
ClickHeavy,

Tick,
}
}
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "l.unity.frameworks",
"displayName": "LFramework",
"version": "1.0.10",
"version": "1.0.11",
"unity": "2022.3",
"description": "Collection of utility methods, design patterns, and extensions for Unity.",
"keywords": [
Expand Down

0 comments on commit 681c9fa

Please sign in to comment.