Skip to content

Commit 3f4bda8

Browse files
committed
Add vibration support
1 parent a540b98 commit 3f4bda8

File tree

3 files changed

+90
-0
lines changed

3 files changed

+90
-0
lines changed

Assets/Plugins/WebGL/WebBridge/CommonCommands.cs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -393,6 +393,38 @@ public void SetCursor(string cursorName)
393393
WebToolPlugins.SetCursor(cursorName);
394394
}
395395

396+
/// <summary>
397+
/// Triggers a vibration on devices that support it.
398+
/// Browser Usage: <code>unityGame.SendMessage("WebGL", "Vibrate", 200);</code>
399+
/// </summary>
400+
/// <param name="durationInMs">Duration of the vibration in milliseconds</param>
401+
[WebCommand(Description = "Vibrate for a given duration in ms")]
402+
public void Vibrate(int durationInMs)
403+
{
404+
WebToolPlugins.Vibrate(durationInMs);
405+
}
406+
407+
/// <summary>
408+
/// Stops any ongoing vibration.
409+
/// Browser Usage: <code>unityGame.SendMessage("WebGL", "StopCurrentVibration");</code>
410+
/// </summary>
411+
[WebCommand(Description = "Stop any ongoing vibration")]
412+
public void StopCurrentVibration()
413+
{
414+
WebToolPlugins.StopCurrentVibration();
415+
}
416+
417+
/// <summary>
418+
/// Triggers a vibration SOS pattern (... --- ...) on devices that support it.
419+
/// Browser Usage: <code>unityGame.SendMessage("WebGL", "VibrateSosPattern");</code>
420+
/// </summary>
421+
[WebCommand(Description = "Vibrate SOS pattern (... --- ...)")]
422+
[ContextMenu(nameof(VibrateSosPattern))]
423+
public void VibrateSosPattern()
424+
{
425+
WebToolPlugins.Vibrate(new int[] { 100, 30, 100, 30, 100, 30, 200, 30, 200, 30, 200, 30, 100, 30, 100, 30, 100 });
426+
}
427+
396428
/// <summary>
397429
/// Captures the current screen and saves it as a PNG file.
398430
/// </summary>

Assets/Plugins/WebGL/WebTools/WebToolPlugins.cs

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,10 @@ public static class WebToolPlugins
4646
private static extern void _DownloadBlob(string filename, byte[] byteArray, int byteLength, string mimeType);
4747
[DllImport("__Internal")]
4848
private static extern void _SetCursor(string cursorName);
49+
[DllImport("__Internal")]
50+
private static extern void _Vibrate(int durationInMs);
51+
[DllImport("__Internal")]
52+
private static extern void _VibratePattern(int[] durationsInMs, int length);
4953

5054
#endif
5155

@@ -330,5 +334,47 @@ public static void SetCursor(string cursorName)
330334
Debug.Log($"{nameof(WebToolPlugins)}.{nameof(SetCursor)} called with cursor: {cursorName}");
331335
#endif
332336
}
337+
338+
/// <summary>
339+
/// Triggers a vibration on devices that support it using the Vibration API.
340+
/// <see href="https://developer.mozilla.org/en-US/docs/Web/API/Navigator/vibrate"/>
341+
/// </summary>
342+
/// <param name="durationInMs">Duration of the vibration in milliseconds</param>
343+
public static void Vibrate(int durationInMs)
344+
{
345+
#if UNITY_WEBGL && !UNITY_EDITOR
346+
_Vibrate(durationInMs);
347+
#elif UNITY_EDITOR && WEBTOOLS_LOG_CALLS
348+
Debug.Log($"{nameof(WebToolPlugins)}.{nameof(Vibrate)} called with duration: {durationInMs}ms");
349+
#endif
350+
}
351+
352+
/// <summary>
353+
/// Triggers a vibration with 0ms on devices that support it using the Vibration API.
354+
/// <see href="https://developer.mozilla.org/en-US/docs/Web/API/Navigator/vibrate"/>
355+
/// </summary>
356+
public static void StopCurrentVibration()
357+
{
358+
#if UNITY_WEBGL && !UNITY_EDITOR
359+
_Vibrate(0);
360+
#elif UNITY_EDITOR && WEBTOOLS_LOG_CALLS
361+
Debug.Log($"{nameof(WebToolPlugins)}.{nameof(StopCurrentVibration)} called");
362+
#endif
363+
}
364+
365+
/// <summary>
366+
/// Triggers a vibration pattern on devices that support it using the Vibration API.
367+
/// Alternating values represent vibration and pause durations.
368+
/// <see href="https://developer.mozilla.org/en-US/docs/Web/API/Navigator/vibrate"/>
369+
/// </summary>
370+
/// <param name="durationsInMs">Alternating vibration/pause durations in milliseconds</param>
371+
public static void Vibrate(int[] durationsInMs)
372+
{
373+
#if UNITY_WEBGL && !UNITY_EDITOR
374+
_VibratePattern(durationsInMs, durationsInMs.Length);
375+
#elif UNITY_EDITOR && WEBTOOLS_LOG_CALLS
376+
Debug.Log($"{nameof(WebToolPlugins)}.{nameof(Vibrate)} called with pattern: [{string.Join(", ", durationsInMs)}]ms");
377+
#endif
378+
}
333379
}
334380
}

Assets/Plugins/WebGL/WebTools/WebToolPlugins.jslib

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,18 @@ var WebGlPlugins =
169169
if (canvasElement) {
170170
canvasElement.style.cursor = cursorStr;
171171
}
172+
},
173+
174+
_Vibrate: function(durationInMs) {
175+
navigator.vibrate(durationInMs);
176+
},
177+
178+
_VibratePattern: function(durationsInMs, length) {
179+
var pattern = [];
180+
for (var i = 0; i < length; i++) {
181+
pattern.push(HEAP32[(durationsInMs >> 2) + i]);
182+
}
183+
navigator.vibrate(pattern);
172184
}
173185
};
174186

0 commit comments

Comments
 (0)