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;
}
}
}