/* * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * Licensed under the Oculus SDK License Agreement (the "License"); * you may not use the Oculus SDK except in compliance with the License, * which is provided at the time of installation or download, or which * otherwise accompanies this software in either electronic or hard copy form. * * You may obtain a copy of the License at * * https://developer.oculus.com/licenses/oculussdk/ * * Unless required by applicable law or agreed to in writing, the Oculus SDK * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ using UnityEngine; using UnityEngine.Events; namespace Oculus.Interaction { /// /// The class provides a way to link Unity events with the state of an . /// This class is designed to trigger Unity events based on changes in the active state, allowing developers to easily connect Interaction SDK logic with Unity's built-in event system. /// /// /// This class is particularly useful for triggering visual or audio effects, or other Unity-based events in response to changes in an interaction's active state. /// public class ActiveStateUnityEventWrapper : MonoBehaviour { /// /// The active state that this class monitors /// [Tooltip("Events will fire based on the state of this IActiveState.")] [SerializeField, Interface(typeof(IActiveState))] private UnityEngine.Object _activeState; private IActiveState ActiveState; [Tooltip("This event will be fired when the provided IActiveState becomes active.")] [SerializeField] private UnityEvent _whenActivated; [Tooltip("This event will be fired when the provided IActiveState becomes inactive.")] [SerializeField] private UnityEvent _whenDeactivated; /// /// The Unity event that is triggered during an when the provided becomes active. /// public UnityEvent WhenActivated => _whenActivated; /// /// The Unity event that is triggered during an when the provided becomes inactive. /// public UnityEvent WhenDeactivated => _whenDeactivated; [SerializeField] [Tooltip("If true, the corresponding event will be fired at the beginning of Update.")] private bool _emitOnFirstUpdate = true; private bool _emittedOnFirstUpdate = false; private bool _savedState; protected virtual void Awake() { ActiveState = _activeState as IActiveState; } protected virtual void Start() { this.AssertField(ActiveState, nameof(ActiveState)); _savedState = false; } /// /// This update method monitors the active state and triggers the appropriate Unity event based on the current state. /// protected virtual void Update() { if (_emitOnFirstUpdate && !_emittedOnFirstUpdate) { InvokeEvent(); _emittedOnFirstUpdate = true; } bool active = ActiveState.Active; if (_savedState != active) { _savedState = active; InvokeEvent(); } } private void InvokeEvent() { if (_savedState) { _whenActivated.Invoke(); } else { _whenDeactivated.Invoke(); } } #region Inject /// /// Injects an active state that this will monitor. This method is used to /// set up the wrapper with the active state whose changes will trigger the associated Unity events. /// /// The instance that will be monitored. public void InjectAllActiveStateUnityEventWrapper(IActiveState activeState) { InjectActiveState(activeState); } /// /// Sets the active state for the wrapper. This method is designed to support dependency injection for unit testing. /// /// The active state to set public void InjectActiveState(IActiveState activeState) { _activeState = activeState as UnityEngine.Object; ActiveState = activeState; } /// /// Optionally sets whether to emit events on the first update. /// /// If true, events will be emitted on the first update. public void InjectOptionalEmitOnFirstUpdate(bool emitOnFirstUpdate) { _emitOnFirstUpdate = emitOnFirstUpdate; } /// /// Injects a Unity event that is triggered when the active state is activated. /// /// The Unity event to trigger on activation. public void InjectOptionalWhenActivated(UnityEvent whenActivated) { _whenActivated = whenActivated; } /// /// Injects a Unity event that is triggered when the active state is deactivated. /// /// The Unity event to trigger on deactivation. public void InjectOptionalWhenDeactivated(UnityEvent whenDeactivated) { _whenDeactivated = whenDeactivated; } #endregion } }