public static ICyanEmuInteractable GetClosestInteractable(this GameObject obj, float distance)
        {
            ICyanEmuInteractable closest = null;
            float bestDistance           = float.MaxValue;

            foreach (var interactable in obj.GetComponents <ICyanEmuInteractable>())
            {
                if (interactable.CanInteract(distance))
                {
                    closest      = interactable;
                    bestDistance = interactable.GetProximity();
                }
            }

            return(closest);
        }
        private void CheckForInteracts()
        {
            // Disable interact check if holding pickup
            if (!shouldCheckForInteracts_())
            {
                SetEnabled(false);
                return;
            }

            //highlightManager.ClearInteracts();

            bool display  = false;
            Ray  ray      = new Ray(raycastTransform_.position, raycastTransform_.forward);
            int  hitCount = Physics.RaycastNonAlloc(ray, raycastHitBuffer, float.MaxValue, INTERACT_LAYERS_);

            Array.Sort(raycastHitBuffer, 0, hitCount, raycastHitComparer);

            // Go through all colliders in order of distance and stop after find something
            // interactable, or a physical collider blocking everything else.
            for (int curHit = 0; curHit < hitCount && !display; ++curHit)
            {
                RaycastHit           hit          = raycastHitBuffer[curHit];
                GameObject           hitObject    = hit.collider.gameObject;
                ICyanEmuInteractable interactable = hitObject.GetClosestInteractable(hit.distance);

                if (interactable != null)
                {
                    //highlightManager.AddInteractable(foundInteractable);

                    HighlightCollider(hit.collider, interactable.GetInteractText());
                    display = true;

                    // TODO get input from input manager
                    if (Input.GetMouseButtonDown(0))
                    {
                        hitObject.Interact(hit.distance);
                    }
                }

                if (!hit.collider.isTrigger)
                {
                    break;
                }
            }

            SetEnabled(display);
        }
 public static bool CanInteract(this ICyanEmuInteractable interactable, float distance)
 {
     return(interactable.CanInteract() && distance < interactable.GetProximity()); // TODO multiply by camera scale?
 }
        public static bool CanInteract(this ICyanEmuInteractable interactable, float distance)
        {
            float proximityCalculation = CalculateInteractDistanceFormula() * interactable.GetProximity();

            return(interactable.CanInteract() && distance <= proximityCalculation);
        }
Esempio n. 5
0
 public void RemoveInteractable(ICyanEmuInteractable interact)
 {
     objectsToHighlight_.Remove(interact);
 }
Esempio n. 6
0
 public void AddInteractable(ICyanEmuInteractable interact)
 {
     objectsToHighlight_.Add(interact);
 }