using System.Collections; using System.Collections.Generic; using UnityEngine; using System.Runtime.InteropServices; using System; #if UNITY_IOS using UnityEngine.iOS; #endif namespace MoreMountains.NiceVibrations { /// /// This class handles all iOS haptics specific calls, pre-CoreHaptics API /// public static class MMNViOS { // The following will only work if the iOSHapticInterface.m file is in a Plugins folder in your project. // It's a pretty straightforward implementation of iOS's UIFeedbackGenerator's methods. // You can learn more about them there : https://developer.apple.com/documentation/uikit/uifeedbackgenerator #if UNITY_IOS && !UNITY_EDITOR [DllImport ("__Internal")] private static extern void MMNViOS_InstantiateFeedbackGenerators(); [DllImport ("__Internal")] private static extern void MMNViOS_ReleaseFeedbackGenerators(); [DllImport ("__Internal")] private static extern void MMNViOS_SelectionHaptic(); [DllImport ("__Internal")] private static extern void MMNViOS_SuccessHaptic(); [DllImport ("__Internal")] private static extern void MMNViOS_WarningHaptic(); [DllImport ("__Internal")] private static extern void MMNViOS_FailureHaptic(); [DllImport ("__Internal")] private static extern void MMNViOS_LightImpactHaptic(); [DllImport ("__Internal")] private static extern void MMNViOS_MediumImpactHaptic(); [DllImport ("__Internal")] private static extern void MMNViOS_HeavyImpactHaptic(); [DllImport ("__Internal")] private static extern void MMNViOS_RigidImpactHaptic(); [DllImport ("__Internal")] private static extern void MMNViOS_SoftImpactHaptic(); #else private static void MMNViOS_InstantiateFeedbackGenerators() { } private static void MMNViOS_ReleaseFeedbackGenerators() { } private static void MMNViOS_SelectionHaptic() { } private static void MMNViOS_SuccessHaptic() { } private static void MMNViOS_WarningHaptic() { } private static void MMNViOS_FailureHaptic() { } private static void MMNViOS_LightImpactHaptic() { } private static void MMNViOS_MediumImpactHaptic() { } private static void MMNViOS_HeavyImpactHaptic() { } private static void MMNViOS_RigidImpactHaptic() { } private static void MMNViOS_SoftImpactHaptic() { } #endif private static bool iOSHapticsInitialized = false; /// /// Call this method to initialize the haptics. If you forget to do it, Nice Vibrations will do it for you the first time you /// call iOSTriggerHaptics. It's better if you do it though. /// public static void iOSInitializeHaptics() { if (!MMNVPlatform.iOS()) { return; } MMNViOS_InstantiateFeedbackGenerators(); iOSHapticsInitialized = true; } /// /// Releases the feedback generators, usually you'll want to call this at OnDisable(); or anytime you know you won't need /// vibrations anymore. /// public static void iOSReleaseHaptics() { if (!MMNVPlatform.iOS()) { return; } MMNViOS_ReleaseFeedbackGenerators(); } /// /// iOS only : triggers a haptic feedback of the specified type /// /// Type. public static void iOSTriggerHaptics(HapticTypes type, bool defaultToRegularVibrate = false) { if (!MMNVPlatform.iOS()) { return; } if (!iOSHapticsInitialized) { iOSInitializeHaptics(); } // this will trigger a standard vibration on all the iOS devices that don't support haptic feedback if (iOSHapticsSupported()) { switch (type) { case HapticTypes.Selection: MMNViOS_SelectionHaptic(); break; case HapticTypes.Success: MMNViOS_SuccessHaptic(); break; case HapticTypes.Warning: MMNViOS_WarningHaptic(); break; case HapticTypes.Failure: MMNViOS_FailureHaptic(); break; case HapticTypes.LightImpact: MMNViOS_LightImpactHaptic(); break; case HapticTypes.MediumImpact: MMNViOS_MediumImpactHaptic(); break; case HapticTypes.HeavyImpact: MMNViOS_HeavyImpactHaptic(); break; case HapticTypes.RigidImpact: MMNViOS_RigidImpactHaptic(); break; case HapticTypes.SoftImpact: MMNViOS_SoftImpactHaptic(); break; } } else if (defaultToRegularVibrate) { #if UNITY_IOS Handheld.Vibrate(); #endif } } /// /// Returns a string containing iOS SDK informations /// /// The OSSDK version. public static string iOSSDKVersion() { #if UNITY_IOS && !UNITY_EDITOR return Device.systemVersion; #else return null; #endif } /// /// Computes and stores the current iOS version /// /// public static float ComputeiOSVersion() { int version = 0; string versionAsString = "0.0.0"; #if UNITY_IOS && !UNITY_EDITOR versionAsString = Device.systemVersion; #endif string[] versionArray = versionAsString.Split('.'); int.TryParse(versionArray[0], out version); return version; } /// /// This methods tests the current device generation against a list of devices that don't support haptics, and returns true if haptics are supported, false otherwise. /// /// true, if supported was hapticsed, false otherwise. public static bool iOSHapticsSupported() { bool hapticsSupported = false; #if UNITY_IOS DeviceGeneration generation = Device.generation; if ((generation == DeviceGeneration.iPhone3G) || (generation == DeviceGeneration.iPhone3GS) || (generation == DeviceGeneration.iPodTouch1Gen) || (generation == DeviceGeneration.iPodTouch2Gen) || (generation == DeviceGeneration.iPodTouch3Gen) || (generation == DeviceGeneration.iPodTouch4Gen) || (generation == DeviceGeneration.iPhone4) || (generation == DeviceGeneration.iPhone4S) || (generation == DeviceGeneration.iPhone5) || (generation == DeviceGeneration.iPhone5C) || (generation == DeviceGeneration.iPhone5S) || (generation == DeviceGeneration.iPhone6) || (generation == DeviceGeneration.iPhone6Plus) || (generation == DeviceGeneration.iPhone6S) || (generation == DeviceGeneration.iPhone6SPlus) || (generation == DeviceGeneration.iPhoneSE1Gen) || (generation == DeviceGeneration.iPad1Gen) || (generation == DeviceGeneration.iPad2Gen) || (generation == DeviceGeneration.iPad3Gen) || (generation == DeviceGeneration.iPad4Gen) || (generation == DeviceGeneration.iPad5Gen) || (generation == DeviceGeneration.iPadAir1) || (generation == DeviceGeneration.iPadAir2) || (generation == DeviceGeneration.iPadMini1Gen) || (generation == DeviceGeneration.iPadMini2Gen) || (generation == DeviceGeneration.iPadMini3Gen) || (generation == DeviceGeneration.iPadMini4Gen) || (generation == DeviceGeneration.iPadPro10Inch1Gen) || (generation == DeviceGeneration.iPadPro10Inch2Gen) || (generation == DeviceGeneration.iPadPro11Inch) || (generation == DeviceGeneration.iPadPro1Gen) || (generation == DeviceGeneration.iPadPro2Gen) || (generation == DeviceGeneration.iPadPro3Gen) || (generation == DeviceGeneration.iPadUnknown) || (generation == DeviceGeneration.iPodTouch1Gen) || (generation == DeviceGeneration.iPodTouch2Gen) || (generation == DeviceGeneration.iPodTouch3Gen) || (generation == DeviceGeneration.iPodTouch4Gen) || (generation == DeviceGeneration.iPodTouch5Gen) || (generation == DeviceGeneration.iPodTouch6Gen) || (generation == DeviceGeneration.iPhone6SPlus)) { hapticsSupported = false; } else { hapticsSupported = true; } #endif return hapticsSupported; } } }