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); }
public void RemoveInteractable(ICyanEmuInteractable interact) { objectsToHighlight_.Remove(interact); }
public void AddInteractable(ICyanEmuInteractable interact) { objectsToHighlight_.Add(interact); }