6using System.Collections.Generic;
11using System.Collections;
15 public static partial class HAR
19 public const double DEFAULT_FREQ_MIN = 65.0;
20 public const double DEFAULT_FREQ_MAX = 300.0;
21 public const double DEFAULT_INTENSITY = 1.0;
22 public const int DEFAULT_LOOPS = 1;
23 public const double DELAY_COMPENSATION = 0.02;
28 public static bool stopHapticEffect =
false;
31 public enum HMaterial_VersionStatus
33 NoAnHapticsMaterial = 0,
34 V3_NeedToBeReworked = 1,
40 #region Haptic Material/Effect Management
41 private static string parseMaterial(UnityEngine.TextAsset _material)
43 if (_material ==
null)
47 return _material.text;
52 if (_material ==
null)
56 return _material.
text;
64 public static int AddHMString(
string jsonContent)
66 return HAR.AddHM(jsonContent);
74 public static int AddHM(UnityEngine.TextAsset _material)
76 return AddHM(parseMaterial(_material));
86 return AddHM(parseMaterial(_material));
95 public static bool UpdateHM(
int _id, UnityEngine.TextAsset _material)
97 return UpdateHM(_id, parseMaterial(_material));
108 return UpdateHM(_id, parseMaterial(_material));
117 public static void AddTargetToEvent(
int _hMaterialId, List<CommandData> _target)
119 AddTargetToEventMarshal(_hMaterialId, _target.ToArray(), _target.Count);
129 public static void UpdateEventPositions(
int _hMaterialId, List<CommandData> _target,
double _texturePosition,
double _stiffnessPosition)
131 UpdateEventPositionsMarshal(_hMaterialId, _target.ToArray(), _target.Count, _texturePosition, _stiffnessPosition);
139 public static void RemoveTargetFromEvent(
int _hMaterialId, List<CommandData> _target)
141 RemoveTargetFromEventMarshal(_hMaterialId, _target.ToArray(), _target.Count);
150 public static void SetTargetIntensity(
int _hMaterialId, List<CommandData> _target,
double _intensity)
152 SetTargetIntensityMarshal(_hMaterialId, _target.ToArray(), _target.Count, _intensity);
159 public static void DebugAPIMode(
string message)
161 if (HapticManager.DebugSwitch)
174 public static void PlayHapticEffect(
HapticMaterial material,
double intensity = DEFAULT_INTENSITY,
int loops = DEFAULT_LOOPS,
float vibrationOffset = 0f,
LateralFlag controllerSide = DEFAULT_CONTROLLER_SIDE)
176#if (UNITY_ANDROID && !ENABLE_METAQUEST && !ENABLE_OPENXR && !UNITY_EDITOR) || UNITY_IOS
177 MobileControl.StopEffects();
180 int hMaterialId = AddHM(material);
181 if (hMaterialId == -1)
183 DebugAPIMode(
"PlayHapticEffect: Failed to add haptic effect.");
187 AddTargetToEvent(hMaterialId, targets);
188 SetEventIntensity(hMaterialId, intensity);
189 SetEventLoop(hMaterialId, loops);
190 PlayEvent(hMaterialId, (
double)-Time.realtimeSinceStartup, 0, 0);
191 double duration = HAR.GetVibrationLength(hMaterialId);
192#if (UNITY_ANDROID && !ENABLE_METAQUEST && !ENABLE_OPENXR && !UNITY_EDITOR) || UNITY_IOS
193 MobileControl.EnqueueEffect(hMaterialId, duration, loops, intensity, vibrationOffset);
194 HAR.PlayEvent(hMaterialId, (
double)-Time.realtimeSinceStartup, 0, 0);
196 DebugAPIMode($
"PlayHapticEffect: Enqueued haptic effect with Material ID {hMaterialId}, Loops {loops}, Intensity {intensity}, Controller Side {controllerSide}.");
206 public static void PlayHapticEffectId(
int hMaterialId,
double intensity = DEFAULT_INTENSITY,
int loops = DEFAULT_LOOPS,
float vibrationOffset = 0f,
LateralFlag controllerSide = DEFAULT_CONTROLLER_SIDE)
208#if (UNITY_ANDROID && !ENABLE_METAQUEST && !ENABLE_OPENXR && !UNITY_EDITOR) || UNITY_IOS
209 MobileControl.StopEffects();
212 if (hMaterialId == -1)
214 DebugAPIMode(
"PlayHapticEffectId: Failed to add haptic material.");
217 double duration = HAR.GetVibrationLength(hMaterialId);
218 SetEventIntensity(hMaterialId, intensity);
219 SetEventLoop(hMaterialId, loops);
220#if (UNITY_ANDROID && !ENABLE_METAQUEST && !ENABLE_OPENXR && !UNITY_EDITOR) || UNITY_IOS
221 MobileControl.EnqueueEffect(hMaterialId, duration, loops, intensity, vibrationOffset);
223 HAR.PlayEvent(hMaterialId, (
double)-Time.realtimeSinceStartup - vibrationOffset, 0, 0);
225 DebugAPIMode($
"PlayHapticEffectId: Enqueued haptic effect with Material ID {hMaterialId}, Loops {loops}, Intensity {intensity}, Controller Side {controllerSide}.");
228 public static void PlayParametricHapticEffect(
double[] _amplitude,
double[] _pitch,
double _freqMin,
double _freqMax,
double[] _transient,
double _intensity,
int _loops,
LateralFlag _controllerSide)
230#if (UNITY_ANDROID && !ENABLE_METAQUEST && !ENABLE_OPENXR && !UNITY_EDITOR) || UNITY_IOS
232 MobileControl.StopEffects();
235 if (_transient !=
null)
237 if (_transient[0] == 0.0)
239 _transient[0] = DELAY_COMPENSATION;
243 int hMaterialId = AddParametricEffect(
244 _amplitude, _amplitude !=
null ? _amplitude.Length : 0,
245 _pitch, _pitch != null ? _pitch.Length : 0,
247 _transient, _transient != null ? _transient.Length : 0,
250 if (hMaterialId == -1)
252 DebugAPIMode(
"PlayParametricHapticEffect: Failed to create parametric effect.");
257 AddTargetToEvent(hMaterialId, targets);
258 SetEventIntensity(hMaterialId, _intensity);
259 DebugAPIMode(
"PlayParametricHapticEffect: Event played at " + Time.realtimeSinceStartup);
260 double vibrationLength = GetVibrationLength(hMaterialId);
261#if (UNITY_ANDROID && !ENABLE_METAQUEST && !ENABLE_OPENXR && !UNITY_EDITOR) || UNITY_IOS
262 MobileControl.EnqueueEffect(hMaterialId, vibrationLength, _loops, _intensity);
264 HAR.PlayEvent(hMaterialId, (
double)-Time.realtimeSinceStartup, 0, 0);
279 public static void PlayAdvanced(
double[] _amplitude,
double[] _pitch,
double _freqMin = DEFAULT_FREQ_MIN,
double _freqMax = DEFAULT_FREQ_MAX,
double[] _transient =
null,
double _intensity = DEFAULT_INTENSITY,
int _loops = DEFAULT_LOOPS,
LateralFlag _controllerSide = DEFAULT_CONTROLLER_SIDE)
281 PlayParametricHapticEffect(_amplitude, _pitch, _freqMin, _freqMax, _transient, _intensity, _loops, _controllerSide);
292 public static void Play(
double[] amplitudes,
double[] transients,
double _intensity = DEFAULT_INTENSITY,
int _loops = DEFAULT_LOOPS,
LateralFlag _controllerSide = DEFAULT_CONTROLLER_SIDE)
294 DebugAPIMode(
"PlayAmplitudesTransients: Playing amplitudes and transients at " + Time.realtimeSinceStartup);
314 public static void Play(
double[] amplitudes,
double _intensity = DEFAULT_INTENSITY,
int _loops = DEFAULT_LOOPS,
LateralFlag _controllerSide = DEFAULT_CONTROLLER_SIDE)
316 DebugAPIMode(
"Play: Playing amplitudes at " + Time.realtimeSinceStartup);
338 public static void PlayTransients(
double[] transients,
double _intensity = DEFAULT_INTENSITY,
int _loops = DEFAULT_LOOPS,
LateralFlag _controllerSide = DEFAULT_CONTROLLER_SIDE)
341 DebugAPIMode(
"PlayTransients: Playing transients at " + Time.realtimeSinceStartup);
362 public static void PlayTransient(
double time = DELAY_COMPENSATION,
double amplitude = 1.0,
double frequency = 1.0,
double _intensity = DEFAULT_INTENSITY,
int _loops = DEFAULT_LOOPS,
LateralFlag _controllerSide = DEFAULT_CONTROLLER_SIDE)
364 DebugAPIMode(
"PlayTransient: Playing transient at " + Time.realtimeSinceStartup);
365 double[]
transient = { time, amplitude, frequency };
380 public static void PlayConstant(
double amplitude,
double time,
double _intensity = DEFAULT_INTENSITY,
int _loops = DEFAULT_LOOPS,
LateralFlag _controllerSide = DEFAULT_CONTROLLER_SIDE)
382 double[] amplitudes = { 0.0, amplitude, time, amplitude };
383 Play(amplitudes, _intensity, _loops, _controllerSide);
386 private static int AndroidVersion
390 using (var version =
new AndroidJavaClass(
"android.os.Build$VERSION"))
392 return version.GetStatic<
int>(
"SDK_INT");
396 public static void MobileCancelHaptics()
398#if (UNITY_ANDROID && !ENABLE_METAQUEST && !ENABLE_OPENXR && !UNITY_EDITOR) || UNITY_IOS
399 MobileControl.StopEffects();
408 private static void StopPreviousHapticEffect()
410#if (UNITY_ANDROID && !ENABLE_METAQUEST && !ENABLE_OPENXR && !UNITY_EDITOR) || UNITY_IOS
411 MobileCancelHaptics();
413 stopHapticEffect =
true;
422 public static void StopCurrentHapticEffect(
int hapticMaterialId)
424#if (UNITY_ANDROID && !ENABLE_METAQUEST && !ENABLE_OPENXR && !UNITY_EDITOR) || UNITY_IOS
425 MobileCancelHaptics();
427 HAR.StopEvent(hapticMaterialId);
Represents a haptic material, which is a ScriptableObject in Unity. This class is used to handle hapt...
string text
Publicly accessible property to get the haptic data text.
GroupID
Enumeration for group identification in haptic command data.
Operator
Enumeration for operator signs in haptic command data.
LateralFlag
Enumeration for lateral flag in haptic command data.
Structure for command data in haptic systems.