예제 #1
0
        public static async UniTask ForceRequest()
        {
            var sceneCount = SceneManager.sceneCount;

            var tasks = new List <UniTask>();

            for (var i = 0; i < sceneCount; i++)
            {
                var scene = SceneManager.GetSceneAt(i);

                var rootObjects = scene.GetRootGameObjects();

                foreach (var rootObject in rootObjects)
                {
                    var targets = UnityUtility.FindObjectsOfInterface <LocalizeAtlasRequest>(rootObject);

                    foreach (var target in targets)
                    {
                        var task = UniTask.Defer(() => target.RequestAtlas());

                        tasks.Add(task);
                    }
                }
            }

            await UniTask.WhenAll(tasks);
        }
예제 #2
0
        public async UniTask RequestAtlas()
        {
            var localizeAtlasManager = LocalizeAtlasManager.Instance;

            var tasks = new List <UniTask>();

            foreach (var folderGuid in folderGuids)
            {
                if (string.IsNullOrEmpty(folderGuid))
                {
                    continue;
                }

                var folderPath = localizeAtlasManager.GetFolderPathFromGuid(folderGuid);

                if (string.IsNullOrEmpty(folderPath))
                {
                    continue;
                }

                var task = UniTask.Defer(() => localizeAtlasManager.LoadAtlas(folderPath));

                tasks.Add(task);
            }

            await UniTask.WhenAll(tasks);
        }
        private async UniTaskVoid DeferSampleAsync()
        {
            // Deferで包むと遅延評価できる
            var uniTask = UniTask.Defer(
                () => LoadTextAsync(@"data.txt"));

            // awaitして初めてLoadTextAsync()が実行される
            await uniTask;
        }
예제 #4
0
파일: DeferTest.cs 프로젝트: zlinst/UniTask
        public async Task D2()
        {
            var created = false;
            var v       = UniTask.Defer(() => { created = true; return(UniTask.Run(() => 10).AsUniTask()); });

            created.Should().BeFalse();

            await v;

            created.Should().BeTrue();
        }
예제 #5
0
파일: DeferTest.cs 프로젝트: zlinst/UniTask
        public async Task D()
        {
            var created = false;
            var v       = UniTask.Defer(() => { created = true; return(UniTask.Run(() => 10)); });

            created.Should().BeFalse();

            var t = await v;

            created.Should().BeTrue();

            t.Should().Be(10);
        }
예제 #6
0
        public async UniTask ReloadAllAtlas()
        {
            var atlasFolders = atlasCacheByAtlasFolder.Keys.ToArray();

            var tasks = new List <UniTask>();

            foreach (var altasFolder in atlasFolders)
            {
                var task = UniTask.Defer(() => LoadAtlas(altasFolder, true));

                tasks.Add(task);
            }

            await UniTask.WhenAll(tasks);
        }
예제 #7
0
        protected override async UniTask UpdateContents(GridVirtualScroll <T> .GridElement info)
        {
            if (elements == null)
            {
                return;
            }

            var elementObjectCount = elements.Count;

            var elementCount = info.Elements.Count;

            try
            {
                // 足りない.
                if (elementObjectCount < elementCount)
                {
                    var num = elementCount - elementObjectCount;

                    var newElements = UnityUtility.Instantiate <TComponent>(elementParent, elementPrefab, num).ToArray();

                    foreach (var newElement in newElements)
                    {
                        OnCreateElement(newElement);
                    }

                    elements.AddRange(newElements);
                }
            }
            catch (Exception e)
            {
                Debug.LogException(e);
            }

            var activeElements      = new List <TComponent>();
            var updateContentsTasks = new List <UniTask>();

            for (var i = 0; i < elementCount; i++)
            {
                var elementIndex = info.StartIndex + i;
                var elementInfo  = info.Elements.ElementAtOrDefault(i);
                var element      = elements.ElementAtOrDefault(i);

                if (element != null && elementInfo != null)
                {
                    activeElements.Add(element);

                    var updateContentsTask = UniTask.Defer(() => UpdateContents(elementIndex, elementInfo, element));

                    updateContentsTasks.Add(updateContentsTask);
                }
            }

            try
            {
                await UniTask.WhenAll(updateContentsTasks);
            }
            catch (Exception e)
            {
                Debug.LogException(e);
            }

            // 無効なオブジェクト非表示.
            foreach (var element in elements)
            {
                var active = activeElements.Contains(element);

                UnityUtility.SetActive(element, active);
            }
        }
예제 #8
0
        public async UniTask RegisterCurrentScene(ISceneArgument sceneArgument)
        {
            if (currentScene != null)
            {
                return;
            }

            var scene = SceneManager.GetSceneAt(0);

            while (!scene.isLoaded)
            {
                await UniTask.DelayFrame(1);
            }

            var definition = ScenePaths.FirstOrDefault(x => x.Value == scene.path);
            var identifier = definition.Equals(default(KeyValuePair <Scenes, string>)) ? null : (Scenes?)definition.Key;

            var sceneInstance = UnityUtility.FindObjectsOfInterface <ISceneBase>().FirstOrDefault();

            CollectUniqueComponents(scene.GetRootGameObjects());

            if (sceneInstance != null)
            {
                currentScene = new SceneInstance(identifier, sceneInstance, SceneManager.GetSceneAt(0));
            }

            if (currentScene == null || currentScene.Instance == null)
            {
                Debug.LogError("Current scene not found.");

                return;
            }

            currentScene.Instance.SetArgument(sceneArgument);

            await OnRegisterCurrentScene(currentScene);

            history.Add(sceneArgument);

            // ISceneEvent.

            var tasks = new List <UniTask>();

            var rootObjects = scene.GetRootGameObjects();

            foreach (var rootObject in rootObjects)
            {
                var targets = UnityUtility.FindObjectsOfInterface <ISceneEvent>(rootObject);

                foreach (var target in targets)
                {
                    var task = UniTask.Defer(() => target.OnLoadScene());

                    tasks.Add(task);
                }
            }

            await UniTask.WhenAll(tasks);

            // Initialize.

            await currentScene.Instance.Initialize();

            // Prepare.

            if (onPrepare != null)
            {
                onPrepare.OnNext(sceneArgument);
            }

            await currentScene.Instance.Prepare(false);

            if (onPrepareComplete != null)
            {
                onPrepareComplete.OnNext(sceneArgument);
            }

            // Enter.

            if (onEnter != null)
            {
                onEnter.OnNext(sceneArgument);
            }

            currentScene.Instance.Enter(false);

            if (onEnterComplete != null)
            {
                onEnterComplete.OnNext(sceneArgument);
            }
        }