@@ -145,11 +145,6 @@ protected override void OnDisable()
145145 instance . CleanUpRaycaster ( raycasters [ i ] ) ;
146146 }
147147 }
148-
149- if ( eventSystem != null )
150- {
151- eventSystem . SetSelectedGameObject ( null , GetBaseEventData ( ) ) ;
152- }
153148 }
154149
155150 public static readonly Comparison < RaycastResult > defaultRaycastComparer = RaycastComparer ;
@@ -225,30 +220,38 @@ public static void RemoveRaycaster(Pointer3DRaycaster raycaster)
225220
226221 protected void CleanUpRaycaster ( Pointer3DRaycaster raycaster )
227222 {
223+ if ( raycaster == null ) { return ; }
224+
228225 var hoverEventData = raycaster . HoverEventData ;
226+ if ( hoverEventData == null || raycaster . ButtonEventDataList . Count == 0 ) { return ; }
229227
230228 hoverEventData . Reset ( ) ;
231229
232- if ( hoverEventData . pointerEnter != null )
233- {
234- hoverEventData . pointerEnter = null ;
235- HandlePointerExitAndEnter ( hoverEventData , null ) ;
236- }
237-
238230 // buttons event
239231 for ( int i = 0 , imax = raycaster . ButtonEventDataList . Count ; i < imax ; ++ i )
240232 {
241233 var buttonEventData = raycaster . ButtonEventDataList [ i ] ;
242- if ( buttonEventData == null ) { continue ; }
234+ if ( buttonEventData == null || buttonEventData == hoverEventData ) { continue ; }
243235
244236 buttonEventData . Reset ( ) ;
245237
246- ProcessPressUp ( buttonEventData ) ;
238+ if ( buttonEventData . eligibleForClick )
239+ {
240+ ProcessPressUp ( buttonEventData ) ;
241+ HandlePressExitAndEnter ( buttonEventData , null ) ;
242+ }
247243
248244 if ( buttonEventData . pointerEnter != null )
249245 {
250- hoverEventData . pointerEnter = null ;
251- HandlePointerExitAndEnter ( buttonEventData , null ) ;
246+ if ( i == 0 )
247+ {
248+ // perform exit event for hover event data
249+ HandlePointerExitAndEnter ( buttonEventData , null ) ;
250+ }
251+ else
252+ {
253+ buttonEventData . pointerEnter = null ;
254+ }
252255 }
253256 }
254257
@@ -259,9 +262,6 @@ protected void CleanUpRaycaster(Pointer3DRaycaster raycaster)
259262 raycaster . ButtonEventDataList [ i ] . pointerPressRaycast = default ( RaycastResult ) ;
260263 raycaster . ButtonEventDataList [ i ] . pointerCurrentRaycast = default ( RaycastResult ) ;
261264 }
262-
263- hoverEventData . pointerPressRaycast = default ( RaycastResult ) ;
264- hoverEventData . pointerCurrentRaycast = default ( RaycastResult ) ;
265265 }
266266
267267 protected virtual void ProcessRaycast ( )
@@ -284,6 +284,10 @@ protected virtual void ProcessRaycast()
284284 for ( var i = processingRaycasters . Count - 1 ; i >= 0 ; -- i )
285285 {
286286 var raycaster = processingRaycasters [ i ] ;
287+ if ( raycaster == null ) { continue ; }
288+
289+ var hoverEventData = raycaster . HoverEventData ;
290+ if ( hoverEventData == null || raycaster . ButtonEventDataList . Count == 0 ) { continue ; }
287291
288292 raycaster . Raycast ( ) ;
289293 var result = raycaster . FirstRaycastResult ( ) ;
@@ -293,8 +297,7 @@ protected virtual void ProcessRaycast()
293297 var raycasterPos = raycaster . transform . position ;
294298 var raycasterRot = raycaster . transform . rotation ;
295299
296- // hover event
297- var hoverEventData = raycaster . HoverEventData ;
300+ // gen shared data and put in hover event
298301 hoverEventData . Reset ( ) ;
299302 hoverEventData . delta = Vector2 . zero ;
300303 hoverEventData . scrollDelta = scrollDelta ;
@@ -306,16 +309,11 @@ protected virtual void ProcessRaycast()
306309 hoverEventData . rotationDelta = Quaternion . Inverse ( hoverEventData . rotation ) * raycasterRot ;
307310 hoverEventData . rotation = raycasterRot ;
308311
309- if ( hoverEventData . pointerEnter != result . gameObject )
310- {
311- HandlePointerExitAndEnter ( hoverEventData , result . gameObject ) ;
312- }
313-
314- // buttons event
312+ // copy data to other button event
315313 for ( int j = 0 , jmax = raycaster . ButtonEventDataList . Count ; j < jmax ; ++ j )
316314 {
317315 var buttonEventData = raycaster . ButtonEventDataList [ j ] ;
318- if ( buttonEventData == null ) { continue ; }
316+ if ( buttonEventData == null || buttonEventData == hoverEventData ) { continue ; }
319317
320318 buttonEventData . Reset ( ) ;
321319 buttonEventData . delta = Vector2 . zero ;
@@ -327,15 +325,21 @@ protected virtual void ProcessRaycast()
327325 buttonEventData . position3D = hoverEventData . position3D ;
328326 buttonEventData . rotationDelta = hoverEventData . rotationDelta ;
329327 buttonEventData . rotation = hoverEventData . rotation ;
328+ }
330329
331- ProcessPress ( buttonEventData ) ;
330+ ProcessPress ( hoverEventData ) ;
331+ ProcessMove ( hoverEventData ) ;
332+ ProcessDrag ( hoverEventData ) ;
332333
333- var hoverGO = buttonEventData . eligibleForClick ? result . gameObject : null ;
334- if ( buttonEventData . pointerEnter != hoverGO )
335- {
336- HandlePointerExitAndEnter ( buttonEventData , hoverGO ) ;
337- }
334+ // other buttons event
335+ for ( int j = 1 , jmax = raycaster . ButtonEventDataList . Count ; j < jmax ; ++ j )
336+ {
337+ var buttonEventData = raycaster . ButtonEventDataList [ j ] ;
338+ if ( buttonEventData == null || buttonEventData == hoverEventData ) { continue ; }
339+
340+ buttonEventData . pointerEnter = hoverEventData . pointerEnter ;
338341
342+ ProcessPress ( buttonEventData ) ;
339343 ProcessDrag ( buttonEventData ) ;
340344 }
341345
@@ -369,21 +373,31 @@ protected virtual void ProcessRaycast()
369373 processingRaycasters . Clear ( ) ;
370374 }
371375
376+ protected virtual void ProcessMove ( PointerEventData eventData )
377+ {
378+ var hoverGO = eventData . pointerCurrentRaycast . gameObject ;
379+ if ( eventData . pointerEnter != hoverGO )
380+ {
381+ HandlePointerExitAndEnter ( eventData , hoverGO ) ;
382+ }
383+ }
384+
372385 protected virtual void ProcessPress ( Pointer3DEventData eventData )
373386 {
374- if ( ! eventData . eligibleForClick )
387+ if ( eventData . GetPressDown ( ) )
375388 {
376- if ( eventData . GetPress ( ) )
377- {
378- ProcessPressDown ( eventData ) ;
379- }
389+ ProcessPressDown ( eventData ) ;
390+ HandlePressExitAndEnter ( eventData , eventData . pointerCurrentRaycast . gameObject ) ;
380391 }
381- else
392+ else if ( eventData . GetPress ( ) )
382393 {
383- if ( ! eventData . GetPress ( ) )
384- {
385- ProcessPressUp ( eventData ) ;
386- }
394+ HandlePressExitAndEnter ( eventData , eventData . pointerCurrentRaycast . gameObject ) ;
395+ }
396+
397+ if ( eventData . GetPressUp ( ) )
398+ {
399+ ProcessPressUp ( eventData ) ;
400+ HandlePressExitAndEnter ( eventData , null ) ;
387401 }
388402 }
389403
@@ -414,7 +428,7 @@ protected void ProcessPressDown(Pointer3DEventData eventData)
414428 newPressed = ExecuteEvents . GetEventHandler < IPointerClickHandler > ( currentOverGo ) ;
415429 }
416430
417- float time = Time . unscaledTime ;
431+ var time = Time . unscaledTime ;
418432
419433 if ( newPressed == eventData . lastPress )
420434 {
@@ -452,21 +466,17 @@ protected void ProcessPressUp(Pointer3DEventData eventData)
452466 {
453467 var currentOverGo = eventData . pointerCurrentRaycast . gameObject ;
454468
455- if ( eventData . pointerPress != null )
456- {
457- ExecuteEvents . Execute ( eventData . pointerPress , eventData , ExecuteEvents . pointerUpHandler ) ;
469+ ExecuteEvents . Execute ( eventData . pointerPress , eventData , ExecuteEvents . pointerUpHandler ) ;
458470
459- // see if we mouse up on the same element that we clicked on...
460- var pointerUpHandler = ExecuteEvents . GetEventHandler < IPointerClickHandler > ( currentOverGo ) ;
471+ // see if we mouse up on the same element that we clicked on...
472+ var pointerUpHandler = ExecuteEvents . GetEventHandler < IPointerClickHandler > ( currentOverGo ) ;
461473
462- if ( eventData . pointerPress == pointerUpHandler && eventData . eligibleForClick )
463- {
464- ExecuteEvents . Execute ( eventData . pointerPress , eventData , ExecuteEvents . pointerClickHandler ) ;
465- }
474+ // PointerClick and Drop events
475+ if ( eventData . pointerPress == pointerUpHandler && eventData . eligibleForClick )
476+ {
477+ ExecuteEvents . Execute ( eventData . pointerPress , eventData , ExecuteEvents . pointerClickHandler ) ;
466478 }
467-
468- // Drop events
469- if ( currentOverGo != null && eventData . pointerDrag != null && eventData . dragging )
479+ else if ( eventData . pointerDrag != null && eventData . dragging )
470480 {
471481 ExecuteEvents . ExecuteHierarchy ( currentOverGo , eventData , ExecuteEvents . dropHandler ) ;
472482 }
@@ -508,7 +518,7 @@ protected void ProcessDrag(Pointer3DEventData eventData)
508518 {
509519 // Before doing drag we should cancel any pointer down state
510520 // And clear selection!
511- if ( eventData . pointerPress != null && eventData . pointerPress != eventData . pointerDrag )
521+ if ( eventData . pointerPress != eventData . pointerDrag )
512522 {
513523 ExecuteEvents . Execute ( eventData . pointerPress , eventData , ExecuteEvents . pointerUpHandler ) ;
514524
@@ -520,6 +530,35 @@ protected void ProcessDrag(Pointer3DEventData eventData)
520530 }
521531 }
522532
533+ protected static void HandlePressExitAndEnter ( Pointer3DEventData eventData , GameObject newEnterTarget )
534+ {
535+ if ( eventData . pressEnter == newEnterTarget ) { return ; }
536+
537+ var oldTarget = eventData . pressEnter == null ? null : eventData . pressEnter . transform ;
538+ var newTarget = newEnterTarget == null ? null : newEnterTarget . transform ;
539+ var commonRoot = default ( Transform ) ;
540+
541+ for ( var t = oldTarget ; t != null ; t = t . parent )
542+ {
543+ if ( newTarget != null && newTarget . IsChildOf ( t ) )
544+ {
545+ commonRoot = t ;
546+ break ;
547+ }
548+ else
549+ {
550+ ExecuteEvents . Execute ( t . gameObject , eventData , ExecutePointer3DEvents . PressExitHandler ) ;
551+ }
552+ }
553+
554+ eventData . pressEnter = newEnterTarget ;
555+
556+ for ( var t = newTarget ; t != commonRoot ; t = t . parent )
557+ {
558+ ExecuteEvents . Execute ( t . gameObject , eventData , ExecutePointer3DEvents . PressEnterHandler ) ;
559+ }
560+ }
561+
523562 protected void DeselectIfSelectionChanged ( GameObject currentOverGo , BaseEventData pointerEvent )
524563 {
525564 // Selection tracking
@@ -562,5 +601,37 @@ public bool SendMoveEventToSelectedObject(float x, float y, float moveDeadZone)
562601 ExecuteEvents . Execute ( selected , data , ExecuteEvents . moveHandler ) ;
563602 return data . used ;
564603 }
604+
605+ public static string PrintGOPath ( GameObject go )
606+ {
607+ var str = string . Empty ;
608+
609+ if ( go != null )
610+ {
611+ for ( var t = go . transform ; t != null ; t = t . parent )
612+ {
613+ if ( ! string . IsNullOrEmpty ( str ) ) { str = "." + str ; }
614+ str = t . name + str ;
615+ }
616+ }
617+
618+ return str ;
619+ }
620+
621+ public override string ToString ( )
622+ {
623+ var str = string . Empty ;
624+
625+ for ( int i = 0 , imax = raycasters . Count ; i < imax ; ++ i )
626+ {
627+ var raycaster = raycasters [ i ] ;
628+ if ( raycaster == null ) { continue ; }
629+
630+ str += "<b>Raycaster: [" + i + "]</b>\n " ;
631+ str += raycaster . ToString ( ) + "\n " ;
632+ }
633+
634+ return str ;
635+ }
565636 }
566637}
0 commit comments