private List <IInteraction> GetViableInteractions(Ray ray, out InteractionEvent interactionEvent) { IInteractionSource source = GetActiveInteractionSource(); if (source == null) { interactionEvent = null; return(new List <IInteraction>()); } IInteractionTarget target = null; Vector3 point = Vector3.zero; if (Physics.Raycast(ray, out RaycastHit hit, float.PositiveInfinity, selectionMask)) { point = hit.point; GameObject targetGo = hit.transform.gameObject; target = targetGo.GetComponent <IInteractionTarget>() ?? new InteractionTargetGameObject(targetGo); if (!source.CanInteractWithTarget(target)) { interactionEvent = null; return(new List <IInteraction>()); } } interactionEvent = new InteractionEvent(source, target, point); IInteraction[] availableInteractions = source.GenerateInteractions(target != null ? new[] { target } : new IInteractionTarget[0]); InteractionEvent @event = interactionEvent; return(availableInteractions.Where(i => i.CanInteract(@event)).ToList()); }
public static T GetComponent <T>(this IInteractionTarget target) where T : class { if (target is IGameObjectProvider provider) { return(provider.GameObject.GetComponent <T>()); } return(null); }
public virtual bool CanInteractWithTarget(IInteractionTarget target) { return(true); }
public InteractionEntry(IInteractionTarget target, IInteraction interaction) { Target = target; Interaction = interaction; }
public InteractionEvent(IInteractionSource source, IInteractionTarget target, Vector3 point = new Vector3()) { Source = source; Target = target; Point = point; }