Example #1
0
    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);
    }
Example #2
0
 public static int distanceAscend(DistanceSortHelper a, DistanceSortHelper b)
 {
     return((int)MathUtility.sign(a.mDistance - b.mDistance));
 }