River Jiang
2020-10-27 1f5eda1c9d22a3676298751c7282a5874f13bed0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
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
{
    /// <summary>
    /// This class handles all iOS haptics specific calls, pre-CoreHaptics API
    /// </summary>
    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;
 
        /// <summary>
        /// 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.
        /// </summary>
        public static void iOSInitializeHaptics()
        {
            if (!MMNVPlatform.iOS()) { return; }
            MMNViOS_InstantiateFeedbackGenerators();
            iOSHapticsInitialized = true;
        }
 
        /// <summary>
        /// Releases the feedback generators, usually you'll want to call this at OnDisable(); or anytime you know you won't need 
        /// vibrations anymore.
        /// </summary>
        public static void iOSReleaseHaptics()
        {
            if (!MMNVPlatform.iOS()) { return; }
            MMNViOS_ReleaseFeedbackGenerators();
        }
 
        /// <summary>
        /// iOS only : triggers a haptic feedback of the specified type
        /// </summary>
        /// <param name="type">Type.</param>
        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
            }
        }
 
        /// <summary>
        /// Returns a string containing iOS SDK informations
        /// </summary>
        /// <returns>The OSSDK version.</returns>
        public static string iOSSDKVersion()
        {
            #if UNITY_IOS && !UNITY_EDITOR
                            return Device.systemVersion;
            #else
                        return null;
            #endif
        }
 
        /// <summary>
        /// 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.
        /// </summary>
        /// <returns><c>true</c>, if supported was hapticsed, <c>false</c> otherwise.</returns>
        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;
        }
    }
}