55 */
66
77#if ENABLE_UNITASK
8+ using Cysharp . Threading . Tasks ;
89using MyGameDevTools . SceneLoading . UniTaskSupport ;
910#endif
1011using NUnit . Framework ;
1112using System . Collections ;
1213using System . Diagnostics ;
14+ using System . Threading . Tasks ;
1315using UnityEngine ;
1416using UnityEngine . SceneManagement ;
1517using UnityEngine . TestTools ;
@@ -31,6 +33,11 @@ public class SceneLoaderTests : SceneTestEnvironment
3133 new LoadSceneInfoName ( SceneBuilder . SceneNames [ 1 ] ) ,
3234 new LoadSceneInfoName ( SceneBuilder . SceneNames [ 2 ] )
3335 } ;
36+ static ILoadSceneInfo [ ] _sameSceneInfos = new ILoadSceneInfo [ ]
37+ {
38+ new LoadSceneInfoName ( SceneBuilder . SceneNames [ 1 ] ) ,
39+ new LoadSceneInfoName ( SceneBuilder . SceneNames [ 1 ] )
40+ } ;
3441 static ILoadSceneInfo [ ] _loadingSceneInfos = new ILoadSceneInfo [ ]
3542 {
3643 null ,
@@ -39,14 +46,14 @@ public class SceneLoaderTests : SceneTestEnvironment
3946 } ;
4047 static ISceneLoader [ ] _sceneLoaders = new ISceneLoader [ ]
4148 {
42- new SceneLoaderCoroutine ( _managers [ 0 ] ) ,
43- new SceneLoaderCoroutine ( _managers [ 1 ] ) ,
4449 new SceneLoaderAsync ( _managers [ 0 ] ) ,
4550 new SceneLoaderAsync ( _managers [ 1 ] ) ,
4651#if ENABLE_UNITASK
4752 new SceneLoaderUniTask ( _managers [ 0 ] ) ,
4853 new SceneLoaderUniTask ( _managers [ 1 ] ) ,
4954#endif
55+ new SceneLoaderCoroutine ( _managers [ 0 ] ) ,
56+ new SceneLoaderCoroutine ( _managers [ 1 ] )
5057 } ;
5158
5259 [ UnityTearDown ]
@@ -110,13 +117,54 @@ public IEnumerator Transition([ValueSource(nameof(_sceneLoaders))] ISceneLoader
110117 Assert . AreEqual ( loadedScene , sceneLoader . Manager . GetActiveScene ( ) ) ;
111118 Assert . AreEqual ( loadedScene . name , targetScene . Reference ) ;
112119
120+ yield return new WaitUntil ( ( ) => ! ( ( ISceneManagerReporter ) sceneLoader . Manager ) . IsUnloadingScenes ) ;
121+
113122 void sceneLoaded ( Scene scene )
114123 {
115124 if ( targetScene . IsReferenceToScene ( scene ) )
116125 loadedScene = scene ;
117126 }
118127 }
119128
129+ [ UnityTest ]
130+ public IEnumerator Transition_Stress ( [ ValueSource ( nameof ( _sceneLoaders ) ) ] ISceneLoader sceneLoader , [ ValueSource ( nameof ( _targetSceneInfos ) ) ] ILoadSceneInfo targetScene , [ ValueSource ( nameof ( _loadingSceneInfos ) ) ] ILoadSceneInfo loadingScene )
131+ {
132+ yield return LoadFirstScene ( sceneLoader ) ;
133+
134+ int type ;
135+ if ( sceneLoader is ISceneLoaderAsync < ValueTask < Scene > > )
136+ type = 1 ;
137+ else if ( sceneLoader is ISceneLoaderAsync < UniTask < Scene > > )
138+ type = 2 ;
139+ else
140+ yield break ; // There is currently no way to correctly get the loaded/unloaded scene in the SceneLoaderCoroutine
141+
142+ Scene loadedScene = default ;
143+ var watch = new Stopwatch ( ) ;
144+
145+ for ( int i = 0 ; i < 20 ; i ++ )
146+ {
147+ switch ( type )
148+ {
149+ case 1 :
150+ var task = ( ( ISceneLoaderAsync < ValueTask < Scene > > ) sceneLoader ) . TransitionToSceneAsync ( targetScene , loadingScene ) . AsTask ( ) ;
151+ yield return new WaitTask ( task ) ;
152+ loadedScene = task . Result ;
153+ break ;
154+ case 2 :
155+ var unitask = ( ( ISceneLoaderAsync < UniTask < Scene > > ) sceneLoader ) . TransitionToSceneAsync ( targetScene , loadingScene ) . AsTask ( ) ;
156+ yield return new WaitTask ( unitask ) ;
157+ loadedScene = unitask . Result ;
158+ break ;
159+ }
160+
161+ Assert . AreEqual ( loadedScene . handle , sceneLoader . Manager . GetActiveScene ( ) . handle ) ;
162+ Assert . AreEqual ( loadedScene . name , targetScene . Reference ) ;
163+ }
164+
165+ yield return new WaitUntil ( ( ) => ! ( ( ISceneManagerReporter ) sceneLoader . Manager ) . IsUnloadingScenes ) ;
166+ }
167+
120168 [ UnityTest ]
121169 public IEnumerator Transition_FromExternalOrigin ( [ ValueSource ( nameof ( _sceneLoaders ) ) ] ISceneLoader sceneLoader , [ ValueSource ( nameof ( _targetSceneInfos ) ) ] ILoadSceneInfo targetScene , [ ValueSource ( nameof ( _loadingSceneInfos ) ) ] ILoadSceneInfo loadingScene )
122170 {
@@ -138,6 +186,8 @@ public IEnumerator Transition_FromExternalOrigin([ValueSource(nameof(_sceneLoade
138186 Assert . AreEqual ( loadedScene , sceneLoader . Manager . GetActiveScene ( ) ) ;
139187 Assert . AreEqual ( loadedScene . name , targetScene . Reference ) ;
140188
189+ yield return new WaitUntil ( ( ) => ! ( ( ISceneManagerReporter ) sceneLoader . Manager ) . IsUnloadingScenes ) ;
190+
141191 void sceneLoaded ( Scene scene )
142192 {
143193 if ( targetScene . IsReferenceToScene ( scene ) )
0 commit comments