public async void OnStartButton() { if (SelectedTier == null || State == ScreenState.Inactive) { return; } Context.Haptic(HapticTypes.SoftImpact, true); if (SelectedTier.StagesValid) { lastScrollPosition = scrollRect.verticalNormalizedPosition; State = ScreenState.Inactive; Context.SelectedGameMode = GameMode.Tier; Context.TierState = new TierState(SelectedTier); LoadedContent = null; scrollRect.GetComponentsInChildren <TierCard>().ForEach(it => it.OnTierStart()); ProfileWidget.Instance.FadeOut(); LoopAudioPlayer.Instance.StopAudio(0.4f); Context.AudioManager.Get("LevelStart").Play(); Context.SelectedMods = Context.Player.Settings.EnabledMods.ToHashSet(); // This will be filtered await UniTask.Delay(TimeSpan.FromSeconds(0.8f)); OpaqueOverlay.Show(); await UniTask.Delay(TimeSpan.FromSeconds(0.8f)); var sceneLoader = new SceneLoader("Game"); sceneLoader.Load(); await UniTask.WaitUntil(() => sceneLoader.IsLoaded); sceneLoader.Activate(); } else { DownloadAndUnpackStages(); } }
public async void ChangeScreen( string targetScreenId, ScreenTransition transition, float duration = 0.4f, float currentScreenTransitionDelay = 0f, float newScreenTransitionDelay = 0f, Vector2?transitionFocus = null, Action <Screen> onFinished = null, bool willDestroy = false, bool addTargetScreenToHistory = true, ScreenPayload payload = default ) { if (ChangingToScreenId != null) { print($"Warning: Already changing to {ChangingToScreenId}! Ignoring."); return; } if (ActiveScreen != null && targetScreenId == ActiveScreen.GetId()) { transition = ScreenTransition.None; newScreenTransitionDelay = duration / 2f; } if (ChangingToScreenId == targetScreenId) { print("Warning: Already changing to the same screen! Ignoring."); return; } ChangingToScreenId = targetScreenId; print($"Changing screen to {targetScreenId}"); if (transition == ScreenTransition.None) { duration = 0; } var lastScreen = ActiveScreen; var newScreen = createdScreens.Find(it => it.GetId() == targetScreenId); var newScreenWasCreated = false; if (newScreen == null) { newScreen = CreateScreen(targetScreenId); newScreenWasCreated = true; } var disableTransitions = Context.ShouldDisableMenuTransitions(); if (lastScreen != null) { if (disableTransitions) { OpaqueOverlay.Show(duration); try { await UniTask.Delay(TimeSpan.FromSeconds(duration), cancellationToken : (screenChangeCancellationTokenSource = new CancellationTokenSource()).Token); } catch { ChangingToScreenId = null; return; } lastScreen.CanvasGroup.alpha = 0; } lastScreen.State = ScreenState.Inactive; if (currentScreenTransitionDelay > 0) { try { await UniTask.Delay(TimeSpan.FromSeconds(currentScreenTransitionDelay), cancellationToken : (screenChangeCancellationTokenSource = new CancellationTokenSource()).Token); } catch { ChangingToScreenId = null; return; } } if (!disableTransitions) { lastScreen.CanvasGroup.DOFade(0, duration); if (transition != ScreenTransition.None) { switch (transition) { case ScreenTransition.In: if (transitionFocus.HasValue && transitionFocus != Vector2.zero) { var difference = new Vector2(Context.ReferenceWidth / 2f, Context.ReferenceHeight / 2f) - transitionFocus.Value; lastScreen.RectTransform.DOLocalMove(difference * 2f, duration); } lastScreen.RectTransform.DOScale(2f, duration); break; case ScreenTransition.Out: lastScreen.RectTransform.DOScale(0.5f, duration); break; case ScreenTransition.Left: lastScreen.RectTransform.DOLocalMove(new Vector3(Context.ReferenceWidth, 0), duration); break; case ScreenTransition.Right: lastScreen.RectTransform.DOLocalMove(new Vector3(-Context.ReferenceWidth, 0), duration); break; case ScreenTransition.Up: lastScreen.RectTransform.DOLocalMove(new Vector3(0, -Context.ReferenceHeight), duration); break; case ScreenTransition.Down: lastScreen.RectTransform.DOLocalMove(new Vector3(0, Context.ReferenceHeight), duration); break; case ScreenTransition.Fade: break; } } } } if (!newScreenWasCreated) { if (DoNotActivateGameObjects) { if (!newScreen.gameObject.activeSelf) { newScreen.gameObject.SetActive(true); } newScreen.ChildrenCanvases.ForEach(it => it.enabled = true); newScreen.ChildrenCanvasGroups.ForEach(it => it.enabled = true); newScreen.ChildrenGraphicRaycasters.ForEach(it => it.enabled = true); } else { newScreen.gameObject.SetActive(true); } } foreach (var listener in screenChangeListeners) { listener.OnScreenChangeStarted(lastScreen, newScreen); } if (newScreenTransitionDelay > 0) { try { await UniTask.Delay(TimeSpan.FromSeconds(newScreenTransitionDelay), cancellationToken : (screenChangeCancellationTokenSource = new CancellationTokenSource()).Token); } catch { ChangingToScreenId = null; return; } } if (payload == null) { payload = newScreen.GetDefaultPayload(); } newScreen.IntentPayload = payload; ActiveScreenId = newScreen.GetId(); newScreen.CanvasGroup.alpha = 0; newScreen.State = ScreenState.Active; var blocksRaycasts = newScreen.CanvasGroup.blocksRaycasts; newScreen.CanvasGroup.interactable = newScreen.CanvasGroup.blocksRaycasts = blocksRaycasts; // Special handling if (disableTransitions) { newScreen.CanvasGroup.alpha = 1f; /*try * { * await UniTask.Delay(TimeSpan.FromSeconds(duration), * cancellationToken: (screenChangeCancellationTokenSource = new CancellationTokenSource()).Token); * await UniTask.DelayFrame(4, * cancellationToken: (screenChangeCancellationTokenSource = new CancellationTokenSource()).Token); // UI rebuild * } * catch * { * ChangingToScreenId = null; * return; * }*/ newScreen.RectTransform.localPosition = Vector3.zero; newScreen.RectTransform.localScale = new Vector3(1, 1); OpaqueOverlay.Hide(duration); } else { newScreen.CanvasGroup.alpha = 0f; newScreen.CanvasGroup.DOFade(1f, duration); newScreen.RectTransform.DOLocalMove(Vector3.zero, duration); if (transition != ScreenTransition.None) { switch (transition) { case ScreenTransition.In: newScreen.RectTransform.localScale = new Vector3(0.5f, 0.5f); newScreen.RectTransform.DOScale(1f, duration); break; case ScreenTransition.Out: newScreen.RectTransform.localScale = new Vector3(2, 2); newScreen.RectTransform.DOScale(1f, duration); break; case ScreenTransition.Left: newScreen.RectTransform.localPosition = new Vector3(-Context.ReferenceWidth, 0); newScreen.RectTransform.localScale = new Vector3(1, 1); break; case ScreenTransition.Right: newScreen.RectTransform.localPosition = new Vector3(Context.ReferenceWidth, 0); newScreen.RectTransform.localScale = new Vector3(1, 1); break; case ScreenTransition.Up: newScreen.RectTransform.localPosition = new Vector3(0, Context.ReferenceHeight); newScreen.RectTransform.localScale = new Vector3(1, 1); break; case ScreenTransition.Down: newScreen.RectTransform.localPosition = new Vector3(0, -Context.ReferenceHeight); newScreen.RectTransform.localScale = new Vector3(1, 1); break; case ScreenTransition.Fade: break; } } } void Action() { ChangingToScreenId = null; if (lastScreen != null && lastScreen != newScreen) { if (DoNotActivateGameObjects) { lastScreen.ChildrenCanvases.ForEach(it => it.enabled = false); lastScreen.ChildrenCanvasGroups.ForEach(it => it.enabled = false); lastScreen.ChildrenGraphicRaycasters.ForEach(it => it.enabled = false); } else { lastScreen.gameObject.SetActive(false); } if (willDestroy) { DestroyScreen(lastScreen.GetId()); } } onFinished?.Invoke(newScreen); foreach (var listener in screenChangeListeners) { listener.OnScreenChangeFinished(lastScreen, newScreen); } } if (duration > 0) { Run.After(duration, Action); } else { Action(); } if (addTargetScreenToHistory) { print($"Adding {newScreen.GetId()} to history"); History.Push(new Intent(newScreen.GetId(), payload)); } }