// -------------------------------------------------------------------------------------------------------------------- // // Copyright (c) VRMADA, All rights reserved. // // -------------------------------------------------------------------------------------------------------------------- using UltimateXR.Avatar; using UltimateXR.Core.Components; using UltimateXR.Manipulation; using UnityEngine; #pragma warning disable 414 // Disable warnings due to unused values namespace UltimateXR.Audio { /// /// Component that enables to play audio depending on the grab and manipulation events of the /// in the same . /// [RequireComponent(typeof(UxrGrabbableObject))] public class UxrAudioManipulation : UxrComponent { #region Inspector Properties/Serialized Fields [Header("Events:")] [SerializeField] private UxrAudioSample _audioOnGrab = new UxrAudioSample(); [SerializeField] private UxrAudioSample _audioOnPlace = new UxrAudioSample(); [SerializeField] private UxrAudioSample _audioOnRelease = new UxrAudioSample(); [Header("Continuous Manipulation:")] [SerializeField] private bool _continuousManipulationAudio; [SerializeField] private AudioClip _audioLoopClip; [SerializeField] [Range(0, 1)] private float _minVolume = 0.3f; [SerializeField] [Range(0, 1)] private float _maxVolume = 1.0f; [SerializeField] private float _minFrequency = 1.0f; [SerializeField] private float _maxFrequency = 1.0f; [SerializeField] private float _minSpeed = 0.01f; [SerializeField] private float _maxSpeed = 1.0f; [SerializeField] private float _minAngularSpeed = 1.0f; [SerializeField] private float _maxAngularSpeed = 1800.0f; [SerializeField] private bool _useExternalRigidbody; [SerializeField] private Rigidbody _externalRigidbody; #endregion #region Public Types & Data /// /// Gets the component in the same . /// public UxrGrabbableObject GrabbableObject => GetCachedComponent(); #endregion #region Unity /// /// Subscribes to manipulation events. /// protected override void OnEnable() { base.OnEnable(); GrabbableObject.Grabbed += Object_Grabbed; GrabbableObject.Placed += Object_Placed; GrabbableObject.Released += Object_Released; } /// /// Unsubscribes from manipulation events. /// protected override void OnDisable() { base.OnDisable(); GrabbableObject.Grabbed -= Object_Grabbed; GrabbableObject.Placed -= Object_Placed; GrabbableObject.Released -= Object_Released; } #endregion #region Event Handling Methods /// /// Called when the object was grabbed. /// /// Grabbable object that sent the event /// Event arguments private void Object_Grabbed(object sender, UxrManipulationEventArgs e) { if (e.Grabber.Avatar == UxrAvatar.LocalAvatar) { _audioOnGrab.Play(transform.position); } } /// /// Called when the object was placed on an . /// /// Grabbable object that sent the event /// Event arguments private void Object_Placed(object sender, UxrManipulationEventArgs e) { if (e.Grabber != null && e.Grabber.Avatar == UxrAvatar.LocalAvatar) { _audioOnPlace.Play(transform.position); } } /// /// Called when the object was released in the air. /// /// Grabbable object that sent the event /// Event arguments private void Object_Released(object sender, UxrManipulationEventArgs e) { if (e.Grabber != null && e.Grabber.Avatar == UxrAvatar.LocalAvatar) { _audioOnRelease.Play(transform.position); } } #endregion } } #pragma warning restore 414