public virtual void SelectGO(bool multiselect, bool allowUnselect) { if (!CanSelect) { return; } Ray ray = Window.Pointer; RaycastHit[] hits = Physics.RaycastAll(ray, float.MaxValue); hits = hits.Where(hit => CanSelectObject(hit.collider.gameObject)).OrderBy(hit => GetDepth(hit.transform)).ToArray(); if (hits.Length > 0) { bool canSelect = hits.Length > 0; if (canSelect && (hits = FilterHits(hits)).Length > 0) { int nextIndex = GetNextIndex(hits); GameObject hitGO = hits[nextIndex].collider.GetComponentInParent <ExposeToEditor>().gameObject; SelectGO(multiselect, allowUnselect, hitGO); } else { if (!multiselect) { TryToClearSelection(); } } } else { Renderer[] selection = m_boxSelection.Pick(); if (selection.Length > 0) { int nextIndex = GetNextIndex(selection); GameObject hitGO = selection[nextIndex].GetComponentInParent <ExposeToEditor>().gameObject; SelectGO(multiselect, allowUnselect, hitGO); } else { if (!multiselect) { TryToClearSelection(); } } } }
public virtual void SelectGO(bool multiselect, bool allowUnselect) { if (!CanSelect) { return; } if (m_boxSelection != null && m_boxSelection.IsThresholdPassed) { return; } IList <RaycastResult> raycastResults = RaycastUIObjects(); if (raycastResults.Count > 0) { SelectGO(multiselect, allowUnselect, raycastResults, raycastResult => raycastResult.gameObject); } else { RaycastHit[] hits = Raycast3DObjects(); if (hits.Length > 0) { bool canSelect = hits.Length > 0; if (canSelect) { hits = FilterHits(hits); } else { hits = new RaycastHit[0]; } SelectGO(multiselect, allowUnselect, hits, hit => hit.collider.gameObject); } else { Renderer[] renderers = m_boxSelection != null?m_boxSelection.Pick() : new Renderer[0]; SelectGO(multiselect, allowUnselect, renderers, renderer => renderer.gameObject); } } }