@@ -318,6 +318,91 @@ public IEnumerator NearInteractionTouchableVolumeVariant()
318
318
Object . Destroy ( touchable . gameObject ) ;
319
319
}
320
320
321
+ /// <summary>
322
+ /// Test NearInteractionTouchableVolume raycasting, by placing a signifcant larger touchable volume next to a smaller one.
323
+ /// Move from one to the other and check if the touch events are only raised once, without loosing "touch".
324
+ /// </summary>
325
+ [ UnityTest ]
326
+ public IEnumerator NearInteractionTouchableVolumeRaycast ( )
327
+ {
328
+ var touchable = CreateTouchable < NearInteractionTouchableVolume > ( Vector3 . one ) ;
329
+ var blocking = CreateTouchable < NearInteractionTouchableVolume > ( new Vector3 ( 10f , 10f , 1f ) ) ;
330
+ blocking . transform . localPosition = objectPosition - new Vector3 ( touchable . TouchableCollider . bounds . extents . z + blocking . TouchableCollider . bounds . extents . z , 0f , 0f ) ;
331
+
332
+ yield return new WaitForFixedUpdate ( ) ;
333
+ yield return null ;
334
+
335
+ TestHand testHand = new TestHand ( Handedness . Left ) ;
336
+ yield return testHand . Show ( blocking . transform . position ) ;
337
+ using ( var catcher = CreateTouchEventCatcher ( touchable ) )
338
+ {
339
+ // Move from center to center, checking if raycasting is hitting the correct touchable volume
340
+ yield return testHand . MoveTo ( objectPosition ) ;
341
+ Assert . AreEqual ( 1 , catcher . EventsStarted ) ;
342
+ Assert . AreEqual ( 0 , catcher . EventsCompleted ) ;
343
+
344
+ // Move back
345
+ yield return testHand . MoveTo ( blocking . transform . position ) ;
346
+ Assert . AreEqual ( 1 , catcher . EventsStarted ) ;
347
+ Assert . AreEqual ( 1 , catcher . EventsCompleted ) ;
348
+ }
349
+
350
+ Object . Destroy ( touchable . gameObject ) ;
351
+ Object . Destroy ( blocking . gameObject ) ;
352
+ }
353
+ /// <summary>
354
+ /// Test nested NearInteractionTouchableVolume instances.
355
+ /// </summary>
356
+ [ UnityTest ]
357
+ public IEnumerator NearInteractionTouchableVolumeNested ( )
358
+ {
359
+ var outer = CreateTouchable < NearInteractionTouchableVolume > ( Vector3 . one ) ;
360
+ var inner = CreateTouchable < NearInteractionTouchableVolume > ( Vector3 . one * 0.1f ) ;
361
+
362
+ Vector3 innerPosition = objectPosition + ( inner . transform . forward * 0.2f ) ;
363
+ inner . transform . localPosition = innerPosition ;
364
+
365
+ var outerCatcher = CreateTouchEventCatcher ( outer ) ;
366
+ var innerCatcher = CreateTouchEventCatcher ( inner ) ;
367
+
368
+ yield return new WaitForFixedUpdate ( ) ;
369
+ yield return null ;
370
+
371
+ TestHand testHand = new TestHand ( Handedness . Left ) ;
372
+ yield return testHand . Show ( Vector3 . zero ) ;
373
+
374
+ // Move into outer cube
375
+ yield return testHand . MoveTo ( objectPosition ) ;
376
+ Assert . AreEqual ( 1 , outerCatcher . EventsStarted ) ;
377
+ Assert . AreEqual ( 0 , outerCatcher . EventsCompleted ) ;
378
+ Assert . AreEqual ( 0 , innerCatcher . EventsStarted ) ;
379
+ Assert . AreEqual ( 0 , innerCatcher . EventsCompleted ) ;
380
+
381
+ // Move from outer into inner cube
382
+ yield return testHand . MoveTo ( innerPosition ) ;
383
+ Assert . AreEqual ( 1 , outerCatcher . EventsStarted ) ;
384
+ Assert . AreEqual ( 1 , outerCatcher . EventsCompleted ) ;
385
+ Assert . AreEqual ( 1 , innerCatcher . EventsStarted ) ;
386
+ Assert . AreEqual ( 0 , innerCatcher . EventsCompleted ) ;
387
+
388
+ // Move fromm inner to outer cube back
389
+ yield return testHand . MoveTo ( objectPosition ) ;
390
+ Assert . AreEqual ( 2 , outerCatcher . EventsStarted ) ;
391
+ Assert . AreEqual ( 1 , outerCatcher . EventsCompleted ) ;
392
+ Assert . AreEqual ( 1 , innerCatcher . EventsStarted ) ;
393
+ Assert . AreEqual ( 1 , innerCatcher . EventsCompleted ) ;
394
+
395
+ // Move from outer back outside
396
+ yield return testHand . MoveTo ( Vector3 . zero ) ;
397
+ Assert . AreEqual ( 2 , outerCatcher . EventsStarted ) ;
398
+ Assert . AreEqual ( 2 , outerCatcher . EventsCompleted ) ;
399
+ Assert . AreEqual ( 1 , innerCatcher . EventsStarted ) ;
400
+ Assert . AreEqual ( 1 , innerCatcher . EventsCompleted ) ;
401
+
402
+ Object . Destroy ( outer . gameObject ) ;
403
+ Object . Destroy ( inner . gameObject ) ;
404
+ }
405
+
321
406
private static void TestEvents ( TouchEventCatcher [ ] catchers , int [ ] eventsStarted , int [ ] eventsCompleted )
322
407
{
323
408
Assert . AreEqual ( catchers . Length , eventsCompleted . Length ) ;
@@ -741,6 +826,9 @@ public IEnumerator NearInteractionTouchableSetTouchableCollider()
741
826
yield return PlayModeTestUtilities . WaitForInputSystemUpdate ( ) ;
742
827
Assert . AreEqual ( 2 , catcher . EventsCompleted ) ;
743
828
}
829
+
830
+ Object . Destroy ( cube ) ;
831
+ Object . Destroy ( cube2 ) ;
744
832
}
745
833
}
746
834
}
0 commit comments