// Copyright (c) Meta Platforms, Inc. and affiliates. using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; namespace Lofelt.NiceVibrations { [Serializable] public class HapticClipsDemoItem { public string Name; public HapticClip HapticClip; public Sprite AssociatedSprite; public AudioSource AssociatedSound; } public class HapticClipsDemoManager : DemoManager { [Header("Image")] public Image IconImage; public Animator IconImageAnimator; public List DemoItems; protected WaitForSeconds _iconChangeDelay; protected int _idleAnimationParameter; protected virtual void Awake() { _iconChangeDelay = new WaitForSeconds(0.02f); _idleAnimationParameter = Animator.StringToHash("Idle"); IconImageAnimator.SetBool(_idleAnimationParameter, true); } // Haptic Clip ----------------------------------------------------------------------------- public virtual void PlayHapticClip(int index) { Logo.Shaking = true; HapticController.fallbackPreset = HapticPatterns.PresetType.LightImpact; HapticController.Play(DemoItems[index].HapticClip); DemoItems[index].AssociatedSound.Play(); StopAllCoroutines(); StartCoroutine(ChangeIcon(DemoItems[index].AssociatedSprite)); } // ICON ------------------------------------------------------------------------------------ protected virtual IEnumerator ChangeIcon(Sprite newSprite) { IconImageAnimator.SetBool(_idleAnimationParameter, false); yield return _iconChangeDelay; IconImage.sprite = newSprite; } // CALLBACKS ------------------------------------------------------------------------------- protected virtual IEnumerator BackToIdle() { Logo.Shaking = false; IconImageAnimator.SetBool(_idleAnimationParameter, true); yield return _iconChangeDelay; IconImage.sprite = DemoItems[0].AssociatedSprite; } void OnHapticsStopped() { StartCoroutine(BackToIdle()); } void OnDisable() { HapticController.PlaybackStopped -= OnHapticsStopped; if (HapticController.IsPlaying()) { HapticController.Stop(); } } void OnEnable() { HapticController.PlaybackStopped += OnHapticsStopped; StartCoroutine(BackToIdle()); } void OnApplicationFocus(bool hasFocus) { if (hasFocus) { StartCoroutine(BackToIdle()); } } } }