@@ -102,6 +102,8 @@ struct ActionRequest
102
102
103
103
const float k_MaxNavMeshDistance = 1f ;
104
104
105
+ RaycastHitComparer m_RaycastHitComparer ;
106
+
105
107
public override void OnNetworkSpawn ( )
106
108
{
107
109
if ( ! IsClient || ! IsOwner )
@@ -113,6 +115,8 @@ public override void OnNetworkSpawn()
113
115
114
116
m_GroundLayerMask = LayerMask . GetMask ( new [ ] { "Ground" } ) ;
115
117
m_ActionLayerMask = LayerMask . GetMask ( new [ ] { "PCs" , "NPCs" , "Ground" } ) ;
118
+
119
+ m_RaycastHitComparer = new RaycastHitComparer ( ) ;
116
120
}
117
121
118
122
void Awake ( )
@@ -177,16 +181,17 @@ void FixedUpdate()
177
181
k_CachedHit [ i ] = default ;
178
182
}
179
183
180
- if ( Physics . RaycastNonAlloc ( ray , k_CachedHit , k_MouseInputRaycastDistance , m_GroundLayerMask ) > 0 )
184
+ var groundHits = Physics . RaycastNonAlloc ( ray , k_CachedHit , k_MouseInputRaycastDistance , m_GroundLayerMask ) ;
185
+ if ( groundHits > 0 )
181
186
{
182
- // sort hits by distance
183
- Array . Sort ( k_CachedHit , ( hit1 , hit2 ) => hit1 . distance . CompareTo ( hit2 . distance ) ) ;
184
-
185
- // find shortest-distance RaycastHit
186
- var closestHit = Array . Find ( k_CachedHit , ( sortedHit ) => sortedHit . collider != null ) ;
187
+ if ( groundHits > 1 )
188
+ {
189
+ // sort hits by distance
190
+ Array . Sort ( k_CachedHit , 0 , groundHits , m_RaycastHitComparer ) ;
191
+ }
187
192
188
193
// verify point is indeed on navmesh surface
189
- if ( NavMesh . SamplePosition ( closestHit . point , out var hit , k_MaxNavMeshDistance , NavMesh . AllAreas ) )
194
+ if ( NavMesh . SamplePosition ( k_CachedHit [ 0 ] . point , out var hit , k_MaxNavMeshDistance , NavMesh . AllAreas ) )
190
195
{
191
196
m_NetworkCharacter . SendCharacterInputServerRpc ( hit . position ) ;
192
197
0 commit comments