22 * @author Valentin Simonov / http://va.lent.in/
33 */
44
5+ using System ;
56using System . Collections . Generic ;
67using TouchScript . Hit ;
78using UnityEngine ;
@@ -16,12 +17,16 @@ namespace TouchScript.Layers
1617 public class CameraLayer : CameraLayerBase
1718 {
1819 #region Private variables
19-
20+ #if UNITY_5_3_OR_NEWER
21+ private RaycastHit [ ] raycastHits = new RaycastHit [ 20 ] ;
22+ #endif
2023 private List < RaycastHit > sortedHits = new List < RaycastHit > ( 20 ) ;
2124 private Transform cachedTransform ;
2225 private List < HitTest > tmpHitTestList = new List < HitTest > ( 10 ) ;
2326
24- #endregion
27+ private RaycastHitComparer comparer ;
28+
29+ #endregion
2530
2631 #region Unity methods
2732
@@ -32,26 +37,31 @@ protected override void Awake()
3237 if ( ! Application . isPlaying ) return ;
3338
3439 cachedTransform = GetComponent < Transform > ( ) ;
40+ comparer = new RaycastHitComparer ( cachedTransform ) ;
3541 }
3642
37- #endregion
43+ #endregion
3844
39- #region Protected functions
45+ #region Protected functions
4046
4147 /// <inheritdoc />
4248 protected override LayerHitResult castRay ( Ray ray , out HitData hit )
4349 {
4450 hit = default ( HitData ) ;
51+ #if UNITY_5_3_OR_NEWER
52+ var count = Physics . RaycastNonAlloc ( ray , raycastHits , float . PositiveInfinity , LayerMask ) ;
53+ #else
4554 var raycastHits = Physics . RaycastAll ( ray , float . PositiveInfinity , LayerMask ) ;
55+ var count = raycastHits . Length ;
56+ #endif
4657
47- if ( raycastHits . Length == 0 ) return LayerHitResult . Miss ;
48- if ( raycastHits . Length > 1 )
58+ if ( count == 0 ) return LayerHitResult . Miss ;
59+ if ( count > 1 )
4960 {
50- sortHits ( raycastHits ) ;
61+ sortHits ( raycastHits , count ) ;
5162
5263 RaycastHit raycastHit = default ( RaycastHit ) ;
53- var i = 0 ;
54- while ( i < sortedHits . Count )
64+ for ( var i = 0 ; i < count ; i ++ )
5565 {
5666 raycastHit = sortedHits [ i ] ;
5767 switch ( doHit ( raycastHit , out hit ) )
@@ -61,7 +71,6 @@ protected override LayerHitResult castRay(Ray ray, out HitData hit)
6171 case HitTest . ObjectHitResult . Discard :
6272 return LayerHitResult . Miss ;
6373 }
64- i ++ ;
6574 }
6675 }
6776 else
@@ -99,20 +108,33 @@ private HitTest.ObjectHitResult doHit(RaycastHit raycastHit, out HitData hit)
99108 return hitResult ;
100109 }
101110
102- private void sortHits ( RaycastHit [ ] hits )
111+ private void sortHits ( RaycastHit [ ] hits , int count )
103112 {
104- var cameraPos = cachedTransform . position ;
105113 sortedHits . Clear ( ) ;
106- sortedHits . AddRange ( hits ) ;
107- sortedHits . Sort ( ( a , b ) =>
114+ for ( var i = 0 ; i < count ; i ++ ) sortedHits . Add ( hits [ i ] ) ;
115+ sortedHits . Sort ( comparer ) ;
116+ }
117+
118+ #endregion
119+
120+ private class RaycastHitComparer : IComparer < RaycastHit >
121+ {
122+ private Transform transform ;
123+
124+ public RaycastHitComparer ( Transform transform )
108125 {
126+ this . transform = transform ;
127+ }
128+
129+ public int Compare ( RaycastHit a , RaycastHit b )
130+ {
131+ var cameraPos = transform . position ;
109132 if ( a . collider . transform == b . collider . transform ) return 0 ;
110133 var distA = ( a . point - cameraPos ) . sqrMagnitude ;
111134 var distB = ( b . point - cameraPos ) . sqrMagnitude ;
112135 return distA < distB ? - 1 : 1 ;
113- } ) ;
136+ }
114137 }
115138
116- #endregion
117139 }
118140}
0 commit comments