namespace Tilia.Interactions.Interactables.Interactors { using System.Collections.Generic; using UnityEngine; using Zinnia.Action; using Zinnia.Data.Attribute; using Zinnia.Extension; using Zinnia.Tracking.Collision; using Zinnia.Tracking.Collision.Active; using Zinnia.Tracking.Collision.Active.Event.Proxy; using Zinnia.Tracking.Collision.Active.Operation; /// /// Sets up the Interactor Prefab touch settings based on the provided user settings. /// public class TouchInteractorConfigurator : MonoBehaviour { #region Facade Settings [Header("Facade Settings")] [Tooltip("The public interface facade.")] [SerializeField] [Restricted] private InteractorFacade facade; /// /// The public interface facade. /// public InteractorFacade Facade { get { return facade; } set { facade = value; } } #endregion #region Touch Settings [Header("Touch Settings")] [Tooltip("The Zinnia.Tracking.Collision.Active.ActiveCollisionsContainer that holds all current collisions.")] [SerializeField] [Restricted] private ActiveCollisionsContainer activeCollisionsContainer; /// /// The that holds all current collisions. /// public ActiveCollisionsContainer ActiveCollisionsContainer { get { return activeCollisionsContainer; } set { activeCollisionsContainer = value; } } [Tooltip("The Slicer that holds the current active collision.")] [SerializeField] [Restricted] private Slicer currentActiveCollision; /// /// The that holds the current active collision. /// public Slicer CurrentActiveCollision { get { return currentActiveCollision; } set { currentActiveCollision = value; } } [Tooltip("The link to any external emitters of the touch state.")] [SerializeField] [Restricted] private ActiveCollisionsContainerEventProxyEmitter externalEmitters; /// /// The link to any external emitters of the touch state. /// public ActiveCollisionsContainerEventProxyEmitter ExternalEmitters { get { return externalEmitters; } set { externalEmitters = value; } } [Tooltip("The ActiveCollisionPublisher for checking valid start touching collisions.")] [SerializeField] [Restricted] private ActiveCollisionPublisher startTouchingPublisher; /// /// The for checking valid start touching collisions. /// public ActiveCollisionPublisher StartTouchingPublisher { get { return startTouchingPublisher; } set { startTouchingPublisher = value; } } [Tooltip("The ActiveCollisionPublisher for checking valid stop touching collisions.")] [SerializeField] [Restricted] private ActiveCollisionPublisher stopTouchingPublisher; /// /// The for checking valid stop touching collisions. /// public ActiveCollisionPublisher StopTouchingPublisher { get { return stopTouchingPublisher; } set { stopTouchingPublisher = value; } } [Tooltip("A BooleanAction for holding the state of whether the Interactor is touching something.")] [SerializeField] [Restricted] private BooleanAction isTouchingAction; /// /// A for holding the state of whether the Interactor is touching something. /// public BooleanAction IsTouchingAction { get { return isTouchingAction; } set { isTouchingAction = value; } } [Tooltip("A CollisionTracker for tracking collisions/touches on this Interactor.")] [SerializeField] [Restricted] private CollisionTracker touchTracker; /// /// A for tracking collisions/touches on this Interactor. /// public CollisionTracker TouchTracker { get { return touchTracker; } set { touchTracker = value; } } #endregion /// /// A collection of currently touched GameObjects. /// public virtual IReadOnlyList TouchedObjects => GetTouchedObjects(); /// /// The currently active touched GameObject. /// public virtual GameObject ActiveTouchedObject => GetActiveTouchedObject(); /// /// A reusable collection to hold the returned touched objects. /// protected readonly List touchedObjects = new List(); protected virtual void OnDisable() { StopTouchingPublisher.SetActiveCollisionsEvenWhenDisabled(StartTouchingPublisher.Payload); StopTouchingPublisher.ForcePublish(); } /// /// Retrieves a collection of currently touched GameObjects. /// /// The currently touched GameObjects. protected virtual IReadOnlyList GetTouchedObjects() { touchedObjects.Clear(); if (ActiveCollisionsContainer == null) { return touchedObjects; } foreach (CollisionNotifier.EventData element in ActiveCollisionsContainer.Elements) { touchedObjects.Add(element.ColliderData.GetContainingTransform().gameObject); } return touchedObjects; } /// /// Retrieves the currently active touched GameObject. /// /// The currently active touched GameObject. protected virtual GameObject GetActiveTouchedObject() { if (CurrentActiveCollision == null || CurrentActiveCollision.SlicedList.ActiveCollisions.Count == 0) { return null; } return CurrentActiveCollision.SlicedList.ActiveCollisions[0].ColliderData.GetContainingTransform().gameObject; } } }