using TMPro; using UnityEngine; using UnityEngine.UI; using UnityEngine.Video; /// /// This class is responsible for loading all data from the Course-scriptableobject. /// Specifically it fetches and displays the correct title, videos and images while also keeping track of the progress. /// public class StartPause : MonoBehaviour { /// /// Reference to instructional video player /// public VideoPlayer player; /// /// Reference to pause button /// public Button button; /// /// Reference to sprite for the pause button /// public Sprite pauseSprite; /// /// Reference to the image for displaying the current words sprite /// public Image wordImage; /// /// Reference to the text object for displaying the current word /// public TextMeshProUGUI title; /// /// Reference to user list to get current user /// public UserList userList; /// /// The current user /// private User user; /// /// Current user progress for this course /// private Progress progress = null; /// /// ScriptableObject with list of all courses /// public CourseList courselist; /// /// Reference to Course ScriptableObject /// private Course course; /// /// Index of the current word/letter in the course.learnables list /// private int currentWordIndex = 0; /// /// This holds the amount of words in the course /// private int maxWords; /// /// Number of correct words so far /// (can be modified to a list or something like that to give better feedback) /// private int correctWords = 0; /// /// This function is called when the script is initialised. /// It takes the correct course from the courselist, using the courseIndex. /// Then it checks whether or not the User has started the course yet, to possibly create a new progress atribute for the course. /// Then it sets up the course-screen to display relevant information from the course-scriptable. /// public void Awake() { // Setting up course course = courselist.courses[courselist.currentCourseIndex]; maxWords = course.learnables.Count; // Create entry in current user for keeping track of progress user = userList.GetCurrentUser(); progress = user.courses.Find((p) => p != null && p.Get("courseIndex") == course.index); if (progress == null) { progress = new Progress(); progress.AddOrUpdate("courseIndex", CourseIndex.FINGERSPELLING); progress.AddOrUpdate("courseProgress", -1.0f); user.courses.Add(progress); } userList.Save(); // Setup UI button.image.sprite = pauseSprite; title.text = course.name; NextVideo(); NextImage(); } // These two functions generate video and image from files /// /// This function uses the word_i integer to grab the correct video from the course.learnabels. /// When it has this video, it will load it into the videoplayer and set it to start. /// private void NextVideo() { player.clip = course.learnables[currentWordIndex].clip; // This loads first frame, so that it can be used as a sort-of preview for the video player.Play(); // As the video will start playiing -> hide button Color col = button.image.color; col.a = 0; button.image.color = col; } /// /// This function uses the word_i integer to grab the correct image from the course.learnabels. /// Then it simply loads it into wordImage so that it can be displayed. /// private void NextImage() { wordImage.sprite = course.learnables[currentWordIndex].image; } /// /// This function is called when the pause-button is pressed on the video. /// It switches between playing and pausing the video. /// It then makes the button invisible when the video is playing, or visible when it's paused. /// public void Pause() { if (!player.isPlaying) { // Play video and hide button player.Play(); Color col = button.image.color; col.a = 0; button.image.color = col; } else { // Pause video and show button player.Pause(); Color col = button.image.color; col.a = 255; button.image.color = col; } } // Press next-sign button for next word /// /// This function is called when the next-sign button is pressed. /// It increased the wordindex and fetches new videos/images if index public void NextSign() { // If the currentindex >= maxwords, it indicated that the course is already finished, running the next code is the meaningless. if (currentWordIndex >= maxWords) { return; } // Goto the next word/letter currentWordIndex++; // TODO: fix correct word count correctWords++; progress.AddOrUpdate("courseProgress", (float)correctWords / (float)maxWords); userList.Save(); // Update UI if course is not finished yet if (currentWordIndex < maxWords) { NextVideo(); NextImage(); } // Finish course and record progress else { FinishCourse(); } } /// /// finishcourse is called to save the "finished" progress to the user. /// public void FinishCourse() { // TODO: update progress (maybe this can also be at the `NextSign()`-method) progress.AddOrUpdate("courseProgress", correctWords / maxWords); userList.Save(); } }