AndroidTaptic.cs 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. using UnityEngine;
  2. public enum HapticTypes { Selection, Success, Warning, Failure, LightImpact, MediumImpact, HeavyImpact , UltraLightImapact}
  3. public class AndroidTaptic {
  4. public static long UltraLightDuration = 25;
  5. public static long LightDuration = 20;
  6. public static long MediumDuration = 40;
  7. public static long HeavyDuration = 80;
  8. public static int UltraLightAmplitude = 90;
  9. public static int LightAmplitude = 40;
  10. public static int MediumAmplitude = 120;
  11. public static int HeavyAmplitude = 255;
  12. private static int _sdkVersion = -1;
  13. private static long[] _successPattern = { 0, LightDuration, LightDuration, HeavyDuration };
  14. private static int[] _successPatternAmplitude = { 0, LightAmplitude, 0, HeavyAmplitude };
  15. private static long[] _warningPattern = { 0, HeavyDuration, LightDuration, MediumDuration };
  16. private static int[] _warningPatternAmplitude = { 0, HeavyAmplitude, 0, MediumAmplitude };
  17. private static long[] _failurePattern = { 0, MediumDuration, LightDuration, MediumDuration, LightDuration, HeavyDuration, LightDuration, LightDuration };
  18. private static int[] _failurePatternAmplitude = { 0, MediumAmplitude, 0, MediumAmplitude, 0, HeavyAmplitude, 0, LightAmplitude };
  19. void Vib() {
  20. #if UNITY_IOS || UNITY_ANDROID
  21. Handheld.Vibrate();
  22. #endif
  23. }
  24. public static void Vibrate() {
  25. AndroidVibrate(MediumDuration);
  26. }
  27. public static void Haptic(HapticTypes type) {
  28. try {
  29. switch (type) {
  30. case HapticTypes.Selection:
  31. AndroidVibrate(LightDuration, LightAmplitude);
  32. break;
  33. case HapticTypes.Success:
  34. AndroidVibrate(_successPattern, _successPatternAmplitude, -1);
  35. break;
  36. case HapticTypes.Warning:
  37. AndroidVibrate(_warningPattern, _warningPatternAmplitude, -1);
  38. break;
  39. case HapticTypes.Failure:
  40. AndroidVibrate(_failurePattern, _failurePatternAmplitude, -1);
  41. break;
  42. case HapticTypes.LightImpact:
  43. AndroidVibrate(LightDuration, LightAmplitude);
  44. break;
  45. case HapticTypes.UltraLightImapact:
  46. AndroidVibrate(UltraLightDuration, UltraLightAmplitude);
  47. break;
  48. case HapticTypes.MediumImpact:
  49. AndroidVibrate(MediumDuration, MediumAmplitude);
  50. break;
  51. case HapticTypes.HeavyImpact:
  52. AndroidVibrate(HeavyDuration, HeavyAmplitude);
  53. break;
  54. }
  55. } catch (System.NullReferenceException e) {
  56. Debug.Log(e.StackTrace);
  57. }
  58. }
  59. #if UNITY_ANDROID && !UNITY_EDITOR
  60. private static AndroidJavaClass UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
  61. private static AndroidJavaObject CurrentActivity = UnityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
  62. private static AndroidJavaObject AndroidVibrator = CurrentActivity.Call<AndroidJavaObject>("getSystemService", "vibrator");
  63. private static AndroidJavaClass VibrationEffectClass;
  64. private static AndroidJavaObject VibrationEffect;
  65. private static int DefaultAmplitude;
  66. #else
  67. private static AndroidJavaClass UnityPlayer;
  68. private static AndroidJavaObject CurrentActivity;
  69. private static AndroidJavaObject AndroidVibrator = null;
  70. private static AndroidJavaClass VibrationEffectClass = null;
  71. private static AndroidJavaObject VibrationEffect;
  72. private static int DefaultAmplitude;
  73. #endif
  74. public static void AndroidVibrate(long milliseconds) {
  75. if (AndroidVibrator != null) {
  76. AndroidVibrator.Call("vibrate", milliseconds);
  77. }
  78. }
  79. public static void AndroidVibrate(long milliseconds, int amplitude) {
  80. if ((AndroidSDKVersion() < 26)) {
  81. AndroidVibrate(milliseconds);
  82. } else {
  83. VibrationEffectClassInitialization();
  84. if (VibrationEffectClass != null) {
  85. VibrationEffect = VibrationEffectClass.CallStatic<AndroidJavaObject>("createOneShot", new object[] { milliseconds, amplitude });
  86. if (VibrationEffect != null && AndroidVibrator != null) {
  87. AndroidVibrator.Call("vibrate", VibrationEffect);
  88. } else {
  89. AndroidVibrate(milliseconds);
  90. }
  91. } else {
  92. AndroidVibrate(milliseconds);
  93. }
  94. }
  95. }
  96. public static void AndroidVibrate(long[] pattern, int repeat) {
  97. if ((AndroidSDKVersion() < 26)) {
  98. if (AndroidVibrator != null) {
  99. AndroidVibrator.Call("vibrate", pattern, repeat);
  100. }
  101. } else {
  102. VibrationEffectClassInitialization();
  103. if (VibrationEffectClass != null) {
  104. VibrationEffect = VibrationEffectClass.CallStatic<AndroidJavaObject>("createWaveform", new object[] { pattern, repeat });
  105. if (VibrationEffect != null && AndroidVibrator != null) {
  106. AndroidVibrator.Call("vibrate", VibrationEffect);
  107. }
  108. }
  109. }
  110. }
  111. public static void AndroidVibrate(long[] pattern, int[] amplitudes, int repeat) {
  112. if ((AndroidSDKVersion() < 26)) {
  113. if (AndroidVibrator != null) {
  114. AndroidVibrator.Call("vibrate", pattern, repeat);
  115. }
  116. } else {
  117. VibrationEffectClassInitialization();
  118. if (VibrationEffectClass != null) {
  119. VibrationEffect = VibrationEffectClass.CallStatic<AndroidJavaObject>("createWaveform", new object[] { pattern, amplitudes, repeat });
  120. if (VibrationEffect != null && AndroidVibrator != null) {
  121. AndroidVibrator.Call("vibrate", VibrationEffect);
  122. }
  123. }
  124. }
  125. }
  126. public static void AndroidCancelVibrations() {
  127. AndroidVibrator.Call("cancel");
  128. }
  129. private static void VibrationEffectClassInitialization() {
  130. if (VibrationEffectClass == null) { VibrationEffectClass = new AndroidJavaClass("android.os.VibrationEffect"); }
  131. }
  132. public static int AndroidSDKVersion() {
  133. if (_sdkVersion == -1) {
  134. int apiLevel = int.Parse(SystemInfo.operatingSystem.Substring(SystemInfo.operatingSystem.IndexOf("-") + 1, 3));
  135. _sdkVersion = apiLevel;
  136. return apiLevel;
  137. } else {
  138. return _sdkVersion;
  139. }
  140. }
  141. }