private void LoadSnakes(TimeTravelData timeTravelData)
    {
        Debug.Log("Time travel Load Snakes");
        foreach (var snake in timeTravelData.snakes)
        {
            List <SnakeBlock> newThisSnake = new List <SnakeBlock>();
            foreach (SnakeTailData snakeTail in snake.Value)
            {
                GameObject newSnakeTailGO = Instantiate(snakePrefabsSettings.TailBlockPrefab, snakeTail.parent);
                SnakeBlock newSnakeTail   = newSnakeTailGO.GetComponent <SnakeBlock>();

                newSnakeTail.currentGridCell = snakeTail.entityCell;
                newSnakeTail.BlockType       = snakeTail.type;
                newSnakeTail.IsHead          = snakeTail.isHead;
                if (newSnakeTail.IsHead)
                {
                    newSnakeTail.spriteRenderer.sprite = newSnakeTail.headSprite;
                    snake.Key.CurrentHead = newSnakeTail;
                }
                newSnakeTail.spriteRenderer.color = snakeTail.color;

                newThisSnake.Add(newSnakeTail);
            }
            snake.Key.ThisSnake = newThisSnake;
        }
    }
    private void LoadFoods(TimeTravelData timeTravelData)
    {
        foreach (FoodData food in timeTravelData.foods)
        {
            GameObject newFoodGO = Instantiate(food.prefab, food.parent);
            Entity     newFood   = newFoodGO.GetComponent <Entity>();

            newFood.currentGridCell = food.entityCell;
        }
    }
    private void RemoveOldTimeTravelData(Snake snake)
    {
        TimeTravelData thisTimeTravel = null;

        foreach (TimeTravelData timeTravelData in snakesTimeTravelData)
        {
            if (timeTravelData.mainSnake == snake)
            {
                thisTimeTravel = timeTravelData;
            }
        }
        snakesTimeTravelData.Remove(thisTimeTravel);
    }
    //When a snake gets a time travel block, it will send an event to time
    //travel handeler, in order to record the grid state.
    public void OnSnakeGetTimeTravelBlock(GameObject snakeGO)
    {
        Snake snake = snakeGO.GetComponent <Snake>();

        RemoveOldTimeTravelData(snake);

        TimeTravelData newTimeTravelData = new TimeTravelData(timeTravelId, snake);

        snakesTimeTravelData.Add(newTimeTravelData);

        OnRequestReferences.Raise(timeTravelId);
        timeTravelId++;
    }
    public void OnStartTimeTravel(GameObject snakeGO)
    {
        Snake snake = snakeGO.GetComponent <Snake>();

        TimeTravelData thisTimeTravel = null;

        OnTimeTravel.Raise();

        foreach (TimeTravelData timeTravelData in snakesTimeTravelData)
        {
            if (timeTravelData.mainSnake == snake)
            {
                thisTimeTravel = timeTravelData;
                LoadSnakes(timeTravelData);
                LoadFoods(timeTravelData);
                OnTimeTravelComplete.Raise();
            }
        }
        snakesTimeTravelData.Remove(thisTimeTravel);
    }