Simple Tutorial system?

So I’m trying to make a simple tutorial for my “endless runner” type game that runs if the player high score is lower than 3, meaning that he is new to the game or doesn’t know how to play properly. What I want to achieve is something like this: The game freezes, display some text and an arrow pointing where the player has to click to advance through the game.
After that, the game unfreezes for a little and then it freezes again showing the next step of what he should do to procceed. It can go forever but Im thinking about 5 steps of freezing, changing the text and the position of the guiding arrow.
I came up with this but Im not sure how to implement the steps changing the text/arrow when the player clicks:

public class Tutorial : MonoBehaviour
{
    public SaveState state;
    public GameObject textContainer;
    public Text tutorialTitle;
    public Text tutorialText;
    public Vector2 arrowPos;

    void Start() {
        if (state.highScore <= 2) {
            StartCoroutine(RunTutorial());
        }
        if (state.highScore > 2) {
            Destroy(tutorialText);
            Destroy(gameObject);
        }
    }

    IEnumerator RunTutorial() {
        yield return new WaitForSeconds(1.5f);
        Time.timeScale = 0;
        textContainer.SetActive(true);
        tutorialTitle.text = "Test tutorial Title";
        tutorialText.text = "Test tutorial text";
    }

    public void Update() {
        //if the player touches the screen it goes to the next step of the tutorial, doesnt matter if he touched the right place or is following it correctly.

        if (Input.GetMouseButtonDown(0)) {
            NextStep();
        }
    }

    void NextStep() {
         ////Change description, title and arrow position for the next step in the tutorial and then
        //make IEnumerator Runtutorial run again
    }
}

As far as I know I think that it would work if I had an array list or an index foreach i in index or something like that,not sure, lists and index are kinda complicated for my newbie mind :s

New script closer to what I expected:

static List<string> titleStrings = new List<string>() { "Frame1", "Frame2", "Frame3", "Frame4", "Frame5", };
    static List<string> textStrings = new List<string>() { "Message1", "Message2", "Message3", "Message4", "Message5", };
    public static bool lastFinished;
     
    void Start() {
        //Check List make sure its safe to continue
        if(Equals(titleStrings,null) && Equals(textStrings,null)){
            //Set Defaults.
            titleStrings = new List<string>() { "Frame1", "Frame2", "Frame3", "Frame4", "Frame5", };
            textStrings = new List<string>() { "Message1", "Message2", "Message3", "Message4", "Message5", };
        }else{
            if (SaveManager.Instance.state.highScore <= 3) {//less then or equal
                 selection = 0;
                 StartCoroutine(RunTutorial(selection));
                 tutorialTitle.text = titleStrings[selection];
            } else {//otherwise
                 //You don't wanna remove or else you may get a null reff error.
            }
        }
    }
    void Update(){
        if(!lastFinished){
             Time.timeScale = 0;
        }else{
             Time.timeScale = 1;
        }
        print(lastFinished);
         //if the player touches the screen it goes to the next step of the tutorial, 
         //doesnt matter if he touched the right place or is following it correctly.
        if (Input.GetMouseButtonDown(0) && lastFinished) {
             StartCoroutine(NextStep());
        }
         //Check List make sure its save to continue
        if(Equals(SaveManager.Instance.state.highScore < 3)){
             return;// Doesn't do anything if Player score is above 3
        }else{
            if (SaveManager.Instance.state.highScore <= 3 && selection <= 5 && lastFinished) {//less then or equal
                 StartCoroutine(RunTutorial(selection));
                 tutorialTitle.text=titleStrings[selection];
            } else {//otherwise
                 //You don't wanna remove or else you may get a null reff error.
            }
        }
    }
    IEnumerator RunTutorial(int currentTutSelection) {
        if(Equals(currentTutSelection,selection)){
            print("TEST");
            lastFinished = false;
            yield return new WaitForSeconds(0.5f);
            textContainer.SetActive(true);
            tutorialTitle.text = titleStrings[currentTutSelection];
            tutorialText.text = textStrings[currentTutSelection];
            lastFinished = true;
        } else {
             yield return new WaitForSeconds(0.01f);//To Satisfy method
        }
    }
    IEnumerator NextStep() {
        textContainer.SetActive(false);
        yield return new WaitForSeconds(0.5f);
        ChangeNext();
    }
     //public change next button
    public void ChangeNext(){
        selection++;
    }
     //override to skip all or to specific
    public void ChangeLast(int lastSelectionValue){
         selection = lastSelectionValue;
    }
     //enable something
    public void ActivateGameObject (GameObject go)
    {
         go.SetActive (true);
    }
     //disable something
    public void DeactivateGameObject (GameObject go)
    {
         go.SetActive (false);
    }
 }

Hi so full disclosure I didn’t read your code super carefully but I implemented a tutorial system in my own game recently. I used beautiful transitions from the asset store, and just enabled/disable the ui elements when the player clicks. It ended up being really simple that way. I then just add however many ui panels I need and make sure that I only load the tutorial canvas if the players asks or if its the first time they entered the game.

Leaving for comments below so they don’t destroy

well a few ways, you could post is in an answer, they seem to not be limited like a comment is, so you should put your whole code in there, that i think how i was able to get you a copy mine. If your having trouble, you can email me directly instead, and do an @zereda-games to send me a notification so that i can go check my emails.

edit:removed an @ sign that was not suppose to be there.

/

thamasbell@gmail.com,

thamasabell@gmail.com,

thamasbell@zeredagames.vpweb.ca,

or

zeredaGames@hotmail.com () FOR VS only.

BUT

@RobAnthem, has a far better method then this and is correct about IEnumerators not being necessary, so maybe just try the code below first before sending me your code, use that as a last resort please. I don’t use them myself unless it’s the only way i can get an effect i want, Sometimes helps sometimes does not. I havn’t figured out how to mimic one inside a void statements yet, but i do know that Invoke can work similar to Start Courotine but are not the same. I’m not 100% sure Exactly what the diff is, I just know myself that there is one. ← needs more explaining someone? Hope this help

Thamas