Пример #1
0
        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());
        }
Пример #2
0
        public static T GetComponent <T>(this IInteractionTarget target) where T : class
        {
            if (target is IGameObjectProvider provider)
            {
                return(provider.GameObject.GetComponent <T>());
            }

            return(null);
        }
Пример #3
0
 public virtual bool CanInteractWithTarget(IInteractionTarget target)
 {
     return(true);
 }
Пример #4
0
 public InteractionEntry(IInteractionTarget target, IInteraction interaction)
 {
     Target      = target;
     Interaction = interaction;
 }
Пример #5
0
 public InteractionEvent(IInteractionSource source, IInteractionTarget target, Vector3 point = new Vector3())
 {
     Source = source;
     Target = target;
     Point  = point;
 }