From 38cd1f8c08cdd898f53ef85a1b1dfa6aa17c4179 Mon Sep 17 00:00:00 2001 From: 13on4rd <116517713+13on4rd@users.noreply.github.com> Date: Fri, 8 Nov 2024 17:47:05 +0100 Subject: [PATCH] WebGL Memory Bugfix (#219) --- Assets/Scripts/Interactable/Teleporter.cs | 2 +- Assets/Scripts/Tutorial/TutorialManager.cs | 73 +++++++++++++--------- 2 files changed, 45 insertions(+), 30 deletions(-) diff --git a/Assets/Scripts/Interactable/Teleporter.cs b/Assets/Scripts/Interactable/Teleporter.cs index 12a847d0..6cf20d8f 100644 --- a/Assets/Scripts/Interactable/Teleporter.cs +++ b/Assets/Scripts/Interactable/Teleporter.cs @@ -232,7 +232,7 @@ private void OnTriggerEnter2D(Collider2D collision) } // tutorial only - if (!isVisited && !teleporterScreenShown) + if (!isVisited && !teleporterScreenShown && GameSettings.GetGamemode() == Gamemode.TUTORIAL) { StartCoroutine(TutorialManager.Instance.LoadNextScreen(1)); isVisited = true; diff --git a/Assets/Scripts/Tutorial/TutorialManager.cs b/Assets/Scripts/Tutorial/TutorialManager.cs index 4eec4612..c39433be 100644 --- a/Assets/Scripts/Tutorial/TutorialManager.cs +++ b/Assets/Scripts/Tutorial/TutorialManager.cs @@ -1,6 +1,6 @@ using Cysharp.Threading.Tasks; using System.Collections; -using TMPro; +using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; @@ -10,19 +10,15 @@ public class TutorialManager : MonoBehaviour public static TutorialManager Instance { get; private set; } // data objects to be displayed - private ContentScreenData[] tutorialContentData; + private List tutorialContentData; // global state variables private static int progressCounter = 0; + private IEnumerator contentDataIterator; private static bool showScreen = true; - [Header("Content Screen")] - [SerializeField] private TMP_Text header; - [SerializeField] private TMP_Text content; - [SerializeField] private TMP_Text buttonLabel; - [Header("Intercatable Elements")] - [SerializeField] private GameObject[] interactables; + [SerializeField] private List interactables; [SerializeField] private GameObject trigger; [SerializeField] private GameObject dungeonBarrier; [SerializeField] private GameObject overworldBarrier; @@ -55,9 +51,9 @@ private void Awake() } #endregion - private void Start() + private async void Start() { - SetupData(); + await SetupData(); audioSource.clip = clickSound; @@ -70,6 +66,9 @@ private void Start() dungeonBarrier.SetActive(true); overworldBarrier.SetActive(true); + + contentDataIterator = tutorialContentData.GetEnumerator(); + contentDataIterator.MoveNext(); } private void PlayClickSound() @@ -82,7 +81,7 @@ private void PlayClickSound() private void Update() { - ProgressBar.Instance.setProgress((float) progressCounter /tutorialContentData.Length); + ProgressBar.Instance.setProgress((float) progressCounter / tutorialContentData.Count); if(showScreen) { @@ -94,12 +93,14 @@ private void Update() /// /// Loads the data to be displayed on the content screens /// - private void SetupData() + private UniTask SetupData() { TextAsset targetFile = Resources.Load("Tutorial/content"); string json= targetFile.text; - tutorialContentData = JsonHelper.GetJsonArray(json); + tutorialContentData = JsonHelper.GetJsonList(json); + + return new UniTask(true); } /// @@ -110,17 +111,28 @@ public async UniTask ActivateInfoScreen(bool status) { if (status) { - await SceneManager.LoadSceneAsync("Content Screen", LoadSceneMode.Additive); + var sceneLoaded = SceneManager.LoadSceneAsync("Content Screen", LoadSceneMode.Additive); + await sceneLoaded; Time.timeScale = 0f; GameManager.Instance.SetIsPaused(true); - UpdateScreen(); + + if (SceneManager.GetSceneByName("Content Screen").isLoaded) + { + UpdateScreen(); + } } else { PlayClickSound(); - await SceneManager.UnloadSceneAsync("Content Screen"); - Time.timeScale = 1f; - progressCounter++; + var sceneUnloaded = SceneManager.UnloadSceneAsync("Content Screen"); + await sceneUnloaded; + Time.timeScale = 1f; + + if (contentDataIterator.MoveNext()) + { + progressCounter++; + } + GameManager.Instance.SetIsPaused(false); if (progressCounter <= 2) @@ -135,21 +147,24 @@ public async UniTask ActivateInfoScreen(bool status) /// public void UpdateScreen() { - ContentScreenData contentData = tutorialContentData[progressCounter]; - - ContentScreenManager.Instance.Setup(contentData); - - if (contentData.GetButtonLabel() != "CONTINUE" && contentData.GetButtonLabel() != "START" && contentData.GetButtonLabel() != "GOT IT") + if (contentDataIterator.Current != null) { - ProgressBar.Instance.DisplayTaskOnScreen(contentData.GetButtonLabel() + "!"); + ContentScreenData contentData = contentDataIterator.Current; + ContentScreenManager.Instance.Setup(contentData); - if (progressCounter - 3 < interactables.Length) + if (contentData.GetButtonLabel() != "CONTINUE" && contentData.GetButtonLabel() != "START" && contentData.GetButtonLabel() != "GOT IT") { - GameObject currentInteractable = interactables[progressCounter - 3]; - currentInteractable.SetActive(true); - ShowInteractableText(currentInteractable, progressCounter - 3); + ProgressBar.Instance.DisplayTaskOnScreen(contentData.GetButtonLabel() + "!"); + + if (progressCounter - 3 < interactables.Count) + { + GameObject currentInteractable = interactables[progressCounter - 3]; + currentInteractable.SetActive(true); + ShowInteractableText(currentInteractable, progressCounter - 3); + } } - } + + } } ///