Пример #1
0
        public override void Unload(ISceneStrategy sceneStrategy)
        {
            if (!HasSceneStrategy(sceneStrategy.SceneName))
            {
                throw new ArgumentOutOfRangeException($"Does not find `{sceneStrategy.SceneName}' in SceneStrategyMap.");
            }

            if (HasPostUnloadSceneStrategy(sceneStrategy.SceneName))
            {
                // First, unload target scene
                UnloadAsObservable(sceneStrategy)
                .ForEachAsync(
                    _ => SceneStrategyMap[sceneStrategy.SceneName]
                    .PostUnloadSceneNameList
                    .ToList()
                    .ForEach(DecrementReferenceCounter)
                    )
                .ObserveOnMainThread()
                // Second, unload post unload scenes
                .SelectMany(
                    _ => SceneStrategyMap[sceneStrategy.SceneName]
                    .PostUnloadSceneNameList
                    .Where(x => !ReferenceCounterMap.ContainsKey(x) || ReferenceCounterMap[x] <= 0)
                    .Select(x => SceneStrategyMap[x])
                    .Where(x => !x.ProtectFromUnloading)
                    .Select(UnloadAsObservable)
                    .WhenAll()
                    )
                .Subscribe();
            }
            else
            {
                UnloadAsObservable(sceneStrategy).Subscribe();
            }
        }
Пример #2
0
        protected bool CanLoadScene(ISceneStrategy sceneStrategy)
        {
            if (sceneStrategy.CanLoadMultiple)
            {
                return(true);
            }

            return(!HasLoaded(sceneStrategy) && (!LoadDisposableMap.ContainsKey(sceneStrategy.SceneName) || LoadDisposableMap[sceneStrategy.SceneName] == null));
        }
Пример #3
0
        protected IObservable <Unit> UnloadAsObservable(ISceneStrategy sceneStrategy)
        {
            if (SceneEntityList.All(x => x.SceneStrategy.SceneName != sceneStrategy.SceneName))
            {
                return(Observable.Throw <Unit>(new ArgumentOutOfRangeException($"Scene name `{sceneStrategy.SceneName}' does not contain in loaded scenes.")));
            }

            SceneStateEntity.WillUnloadSubject.OnNext(sceneStrategy.SceneName);
            // Search from last
            var sceneEntity = SceneEntityList.Last(x => x.SceneStrategy.SceneName == sceneStrategy.SceneName);

            return(sceneEntity
                   .Unload()
                   .ToObservable()
                   .ForEachAsync(_ => SceneEntityList.Remove(sceneEntity)));
        }
Пример #4
0
        protected IObservable <Unit> LoadAsObservable(ISceneStrategy sceneStrategy)
        {
            // Do nothing if duplicate loading
            if (!CanLoadScene(sceneStrategy))
            {
                return(Observable.ReturnUnit());
            }

            var sceneEntity = SceneEntityFactory.Create(sceneStrategy);

            // For blocking when a Load instruction flew in the same frame
            LoadDisposableMap[sceneStrategy.SceneName] = sceneEntity.DidLoadAsObservable().Take(1).Subscribe();
            SceneEntityList.AddLast(sceneEntity);
            SceneStateEntity.WillLoadSubject.OnNext(sceneEntity.SceneStrategy.SceneName);
            return(SceneRepository
                   .GetAsync(sceneStrategy)
                   .ToObservable()
                   .SelectMany(
                       _ => sceneEntity
                       .Load()
                       .ToObservable()
                       )
                   .ForEachAsync(_ => LoadDisposableMap.Remove(sceneStrategy.SceneName)));
        }
Пример #5
0
        public override void Load(ISceneStrategy sceneStrategy)
        {
            if (!HasSceneStrategy(sceneStrategy.SceneName))
            {
                throw new ArgumentOutOfRangeException($"Does not find `{sceneStrategy.SceneName}' in SceneStrategyMap.");
            }

            if (!CanLoadScene(sceneStrategy))
            {
                return;
            }

            if (HasPreLoadSceneStrategy(sceneStrategy.SceneName))
            {
                // First, load pre load scenes
                SceneStrategyMap[sceneStrategy.SceneName]
                .PreLoadSceneNameList
                .Select(x => SceneStrategyMap[x])
                .Select(LoadAsObservable)
                .WhenAll()
                .ForEachAsync(
                    _ => SceneStrategyMap[sceneStrategy.SceneName]
                    .PreLoadSceneNameList
                    .ToList()
                    .ForEach(IncrementReferenceCounter)
                    )
                .ObserveOnMainThread()
                // Second, load target scene
                .SelectMany(_ => LoadAsObservable(sceneStrategy))
                .Subscribe();
            }
            else
            {
                LoadAsObservable(sceneStrategy).Subscribe();
            }
        }
Пример #6
0
 public abstract void Unload(ISceneStrategy sceneStrategy);
Пример #7
0
 private bool HasLoaded(ISceneStrategy sceneStrategy)
 {
     return(RequestEntity.HasLoaded(sceneStrategy.SceneName));
 }
Пример #8
0
 public async Task <IScene> GetAsync(ISceneStrategy sceneStrategy)
 {
     return(await Task.FromResult(SceneStructureFactory.Create(sceneStrategy.SceneName)));
 }
Пример #9
0
 public async Task <IScene> GetAsync(ISceneStrategy sceneStrategy)
 {
     return(await SceneDataStoreResolver.Resolve(sceneStrategy).GetAsync(sceneStrategy));
 }
Пример #10
0
 public SceneEntity(ISceneStrategy sceneStrategy)
 {
     SceneStrategy = sceneStrategy;
 }
Пример #11
0
 public override void Load(ISceneStrategy sceneStrategy)
 {
     LoadAsObservable(sceneStrategy).Subscribe();
 }
Пример #12
0
 public Task <IScene> GetAsync(ISceneStrategy sceneStrategy)
 {
     throw new NotImplementedException();
 }