using System; using TMPro; using Unity.Barracuda; using UnityEngine; using UnityEngine.UI; using UnityEngine.Video; /// /// TemplateCourse scene manager /// public class TemplateCourse : MonoBehaviour { // vvv TEMPORARY STUFF vvv public NNModel previewModel; public GameObject feedbackProgressBar; public GameObject previewMessage; // ^^^ TEMPORARY STUFF ^^^ /// /// 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 TMP_Text 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; /// /// The "finished" screen /// public GameObject ResultPanel; /// /// Button to go back to courses list /// public Button CoursesButton; /// /// DateTime containint the start moment /// private DateTime startMoment; /// /// Reference to the timeSpent UI /// public TMP_Text timeSpent; /// /// Reference to the feedback script on the Feedback prefab /// public Feedback feedback; /// /// This function is called when the script is initialised. /// It inactivatis the popup, finds a webcam to use and links it via the WebcamTexture to the display RawImage. /// 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. /// void Awake() { // Setting up course course = courselist.courses[courselist.currentCourseIndex]; feedback.signPredictor.model = course.theme.model; maxWords = course.theme.learnables.Count; // vvv TEMPORARY STUFF vvv feedbackProgressBar.SetActive(course.theme.model != null); previewMessage.SetActive(course.theme.model == null); feedback.signPredictor.model = previewModel; // ^^^ TEMPORARY STUFF ^^^ // Create entry in current user for keeping track of progress userList.Load(); user = userList.GetCurrentUser(); progress = user.GetCourseProgress(course.index); if (progress == null) { progress = new Progress(); progress.AddOrUpdate("courseIndex", course.index); progress.AddOrUpdate("courseProgress", -1.0f); user.courses.Add(progress); } userList.Save(); // Force the videoplayer to add bars to preserve aspect ratio player.aspectRatio = VideoAspectRatio.FitInside; // Setup UI button.image.sprite = pauseSprite; title.text = course.title; NextVideo(); NextImage(); // Hide the result panel ResultPanel.SetActive(false); // Set the startTime startMoment = DateTime.Now; // Set callbacks feedback.getSignCallback = () => { if (currentWordIndex < course.theme.learnables.Count) { return course.theme.learnables[currentWordIndex].name; } return null; }; feedback.predictSignCallback = (sign) => { if (sign == course.theme.learnables[currentWordIndex].name) { NextSign(); } }; } /// /// 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.theme.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.theme.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; } } /// /// 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() { // Show the "finished" screen ResultPanel.SetActive(true); // Set the total time spent UI TimeSpan time = DateTime.Now - startMoment; timeSpent.text = time.ToString(@"hh\:mm\:ss"); // Link button CoursesButton.onClick.AddListener(() => { SystemController.GetInstance().BackToPreviousScene(); }); progress.AddOrUpdate("courseProgress", 1f); userList.Save(); } }