protected void raycastMovableObject(ref Ray ray, List <IMouseEventCollect> moveObjectList, List <IMouseEventCollect> retList, ref bool continueRay, bool clearList = true) { if (clearList) { retList.Clear(); } continueRay = true; RaycastHit hit; LIST(out List <DistanceSortHelper> sortList); int objCount = moveObjectList.Count; for (int i = 0; i < objCount; ++i) { IMouseEventCollect box = moveObjectList[i]; // 将所有射线碰到的物体都放到列表中 if (box.isActive() && box.isHandleInput() && box.getCollider().Raycast(ray, out hit, 10000.0f)) { sortList.Add(new DistanceSortHelper(getSquaredLength(hit.point - ray.origin), box)); } } // 根据相交点由近到远的顺序排序 quickSort(sortList, DistanceSortHelper.mCompareAscend); int sortCount = sortList.Count; for (int i = 0; i < sortCount; ++i) { DistanceSortHelper item = sortList[i]; retList.Add(item.mObject); if (!item.mObject.isPassRay()) { continueRay = false; break; } } UN_LIST(sortList); }
public static int distanceAscend(DistanceSortHelper a, DistanceSortHelper b) { return((int)MathUtility.sign(a.mDistance - b.mDistance)); }