@@ -14,7 +14,7 @@ public class Pointer3DInputModule : BaseInputModule
1414 private static bool isApplicationQuitting = false ;
1515
1616 private static readonly IndexedSet < Pointer3DRaycaster > raycasters = new IndexedSet < Pointer3DRaycaster > ( ) ;
17- private static readonly List < Pointer3DRaycaster > processingRaycasters = new List < Pointer3DRaycaster > ( ) ;
17+ private static IndexedSet < Pointer3DRaycaster > processingRaycasters = new IndexedSet < Pointer3DRaycaster > ( ) ;
1818 private static int validEventDataId = PointerInputModule . kFakeTouchesId - 1 ;
1919
2020#if UNITY_5_5_OR_NEWER
@@ -138,7 +138,7 @@ protected override void OnDisable()
138138 {
139139 base . OnDisable ( ) ;
140140
141- if ( Active )
141+ if ( Active && processingRaycasters . Count == 0 )
142142 {
143143 for ( var i = raycasters . Count - 1 ; i >= 0 ; -- i )
144144 {
@@ -210,22 +210,28 @@ public static void AddRaycaster(Pointer3DRaycaster raycaster)
210210 raycasters . AddUnique ( raycaster ) ;
211211 }
212212
213- public static void RemoveRaycasters ( Pointer3DRaycaster raycaster )
213+ public static void RemoveRaycaster ( Pointer3DRaycaster raycaster )
214214 {
215- raycasters . Remove ( raycaster ) ;
215+ if ( ! raycasters . Remove ( raycaster ) ) { return ; }
216+
217+ if ( ! processingRaycasters . Contains ( raycaster ) && Active )
218+ {
219+ Instance . CleanUpRaycaster ( raycaster ) ;
220+ }
216221 }
217222
223+ [ Obsolete ( "Use RemoveRaycaster instead" ) ]
224+ public static void RemoveRaycasters ( Pointer3DRaycaster raycaster ) { RemoveRaycaster ( raycaster ) ; }
225+
218226 protected void CleanUpRaycaster ( Pointer3DRaycaster raycaster )
219227 {
220- raycaster . CleanUpRaycast ( ) ;
221-
222228 var hoverEventData = raycaster . HoverEventData ;
223229
224- // hover event
225- hoverEventData . pointerCurrentRaycast = default ( RaycastResult ) ;
230+ hoverEventData . Reset ( ) ;
226231
227232 if ( hoverEventData . pointerEnter != null )
228233 {
234+ hoverEventData . pointerEnter = null ;
229235 HandlePointerExitAndEnter ( hoverEventData , null ) ;
230236 }
231237
@@ -236,15 +242,26 @@ protected void CleanUpRaycaster(Pointer3DRaycaster raycaster)
236242 if ( buttonEventData == null ) { continue ; }
237243
238244 buttonEventData . Reset ( ) ;
239- buttonEventData . pointerCurrentRaycast = default ( RaycastResult ) ;
240245
241246 ProcessPressUp ( buttonEventData ) ;
242247
243248 if ( buttonEventData . pointerEnter != null )
244249 {
250+ hoverEventData . pointerEnter = null ;
245251 HandlePointerExitAndEnter ( buttonEventData , null ) ;
246252 }
247253 }
254+
255+ raycaster . CleanUpRaycast ( ) ;
256+
257+ for ( int i = 0 , imax = raycaster . ButtonEventDataList . Count ; i < imax ; ++ i )
258+ {
259+ raycaster . ButtonEventDataList [ i ] . pointerPressRaycast = default ( RaycastResult ) ;
260+ raycaster . ButtonEventDataList [ i ] . pointerCurrentRaycast = default ( RaycastResult ) ;
261+ }
262+
263+ hoverEventData . pointerPressRaycast = default ( RaycastResult ) ;
264+ hoverEventData . pointerCurrentRaycast = default ( RaycastResult ) ;
248265 }
249266
250267 protected virtual void ProcessRaycast ( )
@@ -254,13 +271,20 @@ protected virtual void ProcessRaycast()
254271
255272 // use another list to iterate raycasters
256273 // incase that raycasters may changed during this process cycle
257- processingRaycasters . AddRange ( raycasters ) ;
274+ for ( int i = 0 , imax = raycasters . Count ; i < imax ; ++ i )
275+ {
276+ var r = raycasters [ i ] ;
277+
278+ if ( r != null )
279+ {
280+ processingRaycasters . Add ( r ) ;
281+ }
282+ }
283+
258284 for ( var i = processingRaycasters . Count - 1 ; i >= 0 ; -- i )
259285 {
260286 var raycaster = processingRaycasters [ i ] ;
261287
262- if ( raycaster == null || ! raycaster . isActiveAndEnabled ) { continue ; }
263-
264288 raycaster . Raycast ( ) ;
265289 var result = raycaster . FirstRaycastResult ( ) ;
266290
@@ -321,10 +345,24 @@ protected virtual void ProcessRaycast()
321345 var scrollHandler = ExecuteEvents . GetEventHandler < IScrollHandler > ( result . gameObject ) ;
322346 ExecuteEvents . ExecuteHierarchy ( scrollHandler , hoverEventData , ExecuteEvents . scrollHandler ) ;
323347 }
348+ }
324349
325- if ( ! raycaster . isActiveAndEnabled )
350+ if ( isActiveAndEnabled )
351+ {
352+ for ( var i = processingRaycasters . Count - 1 ; i >= 0 ; -- i )
353+ {
354+ var r = processingRaycasters [ i ] ;
355+ if ( ! raycasters . Contains ( r ) )
356+ {
357+ CleanUpRaycaster ( r ) ;
358+ }
359+ }
360+ }
361+ else
362+ {
363+ for ( var i = processingRaycasters . Count - 1 ; i >= 0 ; -- i )
326364 {
327- CleanUpRaycaster ( raycaster ) ;
365+ CleanUpRaycaster ( processingRaycasters [ i ] ) ;
328366 }
329367 }
330368
0 commit comments