void Start()
    {
        generateError = GameObject.Find("GenerateErrorToggle").GetComponent <Toggle>();
        status        = GameObject.Find("Status").GetComponent <Text>();
        Debug.Assert(status != null && generateError != null);

#if UNITY_EDITOR
        //STEP1:  In your real project this should happen in App.xaml.cs and you will instantiata different factory..
        Microsoft.UnityPlugins.MicrosoftAdsBridge.InterstitialAdFactory = new EditorAdFactory();
#else
        generateError.interactable = false;
        generateError.transform.FindChild("Label").GetComponent <Text>().color = new Color(0, 0, 0, 0);
#endif

        ad = MicrosoftAdsBridge.InterstitialAdFactory.CreateAd(OnAdReady, OnAdCompleted, OnAdCancelled, OnAdError);

#if UNITY_EDITOR
        //This is not needed in production.. here we use it to show a fake ad so you can work your
        // workflow of stopping pausing to play ad, unpausing, etc..
        ((EditorInterstitialAd)ad).syncMonoBehaviour = this;

        var canvas = GameObject.Find("Canvas").GetComponent <Canvas>();
        ((EditorInterstitialAd)ad).canvas = canvas;
#endif
    }
    private void GameState_StatusChanged(object sender, GameStatusChangedEventArgs e)
    {
        if (e.NewState == GameState.GameStatus.GetReadyCompleted)
        {
            Debug.Assert(e.OldState == GameState.GameStatus.GetReady);
            GotoPlaying();
        }
        else if (e.NewState == GameState.GameStatus.Restarting)
        {
            SoundManager.Instance.PlayLifeLost();
        }
        else if (e.NewState == GameState.GameStatus.GameOver)
        {
            SoundManager.Instance.PlayGameOver();
        }
        else if (e.NewState == GameState.GameStatus.Win)
        {
            boardManager.BroadcastMessage("WinAchieved");
            //NOTE: it is important that we do PLayWin () as that triggers next step..  (lame!!)
#if SHOWADS
            if ((GameState.Instance.CurrentLevel % adsFrequency) == (adsFrequency - 1))
            {
                SoundManager.Instance.PlayWin();
                if (MicrosoftAdsBridge.InterstitialAdFactory != null)
                {
                    if (ad == null)
                    {
                        ad = MicrosoftAdsBridge.InterstitialAdFactory.CreateAd();
                        ad.AddCallback(AdCallback.Completed, adCompleted);
                        ad.AddCallback(AdCallback.Cancelled, adCancelled);
#if UNITY_EDITOR
                        EditorInterstitialAd eiad = ad as EditorInterstitialAd;
                        if (eiad != null)
                        {
                            eiad.canvas            = GameObject.Find("Hud").GetComponent <Canvas>();
                            eiad.syncMonoBehaviour = this;
                        }
#endif
                    }
                    ad.Request(appId, GetNextAdUnitId(AdType.Video), AdType.Video);
                }
            }
            else if ((GameState.Instance.CurrentLevel % adsFrequency == 0) && (ad != null) && (ad.State == InterstitialAdState.Ready))
            {
                GameState.Instance.SetState(GameState.GameStatus.PlayingAdvertisement);
                SoundManager.Instance.PauseBackgroundMusic();
                ad.Show();
            }
            else
#endif
            {
                SoundManager.Instance.PlayWin();
            }
        }
        else if (e.NewState == GameState.GameStatus.AdvertisementCompleted ||
                 e.NewState == GameState.GameStatus.WinCompleted)
        {
            if (e.NewState == GameState.GameStatus.AdvertisementCompleted)
            {
                SoundManager.Instance.UnPauseBackgroundMusic();
            }

            int next = GameState.Instance.GetNextLevel();
            boardManager.InstantiateLevel(next, GameState.Instance.GetLevel(next), new MonsterGame.DefaultMazeConfig(boardManager.transform.position));
            GotoGetReady();
            HandleLevelCompleted(next);
        }
        else if (e.NewState == GameState.GameStatus.Paused)
        {
#if USEPAUSE
            if (!isPauseShowing && hasGameStarted)
            {
                Debug.Log("Show pause");
                Application.LoadLevelAdditive("Pause");
                isPauseShowing = true;
            }
#endif
        }
        else if (e.NewState == GameState.GameStatus.WinCompleted)
        {
        }
        else if (e.NewState == GameState.GameStatus.LifeLostCompleted)
        {
            Debug.Assert(GameState.Instance.HasLives);
            boardManager.UseNextLive();
            GotoGetReady();
        }
        else if (e.NewState == GameState.GameStatus.GameOverCompleted)
        {
            GoBack();
        }


        if (e.OldState == GameState.GameStatus.Paused)
        {
#if USEPAUSE
            if (isPauseShowing)
            {
                Application.UnloadLevel("Pause");
            }
            isPauseShowing = false;
#endif
        }
    }
 void adCompeted(object ununsed)
 {
     ad.Dispose();
     ad = null;
 }
    void Start()
    {
        generateError = GameObject.Find("GenerateErrorToggle").GetComponent<Toggle>();
        status = GameObject.Find("Status").GetComponent<Text>();
        Debug.Assert(status != null && generateError != null);

        #if UNITY_EDITOR
        //STEP1:  In your real project this should happen in App.xaml.cs and you will instantiata different factory..
        Microsoft.UnityPlugins.MicrosoftAdsBridge.InterstitialAdFactory = new EditorAdFactory();
        #else
        generateError.interactable = false;
        generateError.transform.FindChild("Label").GetComponent<Text>().color = new Color(0, 0, 0, 0);
        #endif

        ad = MicrosoftAdsBridge.InterstitialAdFactory.CreateAd(OnAdReady, OnAdCompleted, OnAdCancelled, OnAdError);

        #if UNITY_EDITOR
        //This is not needed in production.. here we use it to show a fake ad so you can work your
        // workflow of stopping pausing to play ad, unpausing, etc..
        ((EditorInterstitialAd)ad).syncMonoBehaviour = this;

        var canvas = GameObject.Find("Canvas").GetComponent<Canvas>();
        ((EditorInterstitialAd)ad).canvas = canvas ;

        #endif
    }
    private void GameState_StatusChanged(object sender, GameStatusChangedEventArgs e)
    {         
       if ( e.NewState == GameState.GameStatus.GetReadyCompleted )
        {            
            Debug.Assert(e.OldState == GameState.GameStatus.GetReady); 
             GotoPlaying(); 
        }
        else if ( e.NewState == GameState.GameStatus.Restarting )
        {            
            SoundManager.Instance.PlayLifeLost();
        }
        else if ( e.NewState == GameState.GameStatus.GameOver )
        {
            SoundManager.Instance.PlayGameOver();              
        }
        else if ( e.NewState == GameState.GameStatus.Win )
        {       
            boardManager.BroadcastMessage("WinAchieved");
           //NOTE: it is important that we do PLayWin () as that triggers next step..  (lame!!)                                
#if SHOWADS
            if ((GameState.Instance.CurrentLevel % adsFrequency ) == (adsFrequency-1))
            {
                SoundManager.Instance.PlayWin();
                if (MicrosoftAdsBridge.InterstitialAdFactory != null)
                {
                    if (ad == null )
                    {
                        ad = MicrosoftAdsBridge.InterstitialAdFactory.CreateAd();
                        ad.AddCallback(AdCallback.Completed, adCompleted);
                        ad.AddCallback(AdCallback.Cancelled, adCancelled); 
#if UNITY_EDITOR
                        EditorInterstitialAd eiad = ad as EditorInterstitialAd;
                        if (eiad != null)
                        {
                            eiad.canvas = GameObject.Find("Hud").GetComponent<Canvas>();
                            eiad.syncMonoBehaviour = this; 
                        }
                        

#endif
                    }
                    ad.Request (appId, GetNextAdUnitId(AdType.Video ), AdType.Video); 
                }
            }          
            else if ( (GameState.Instance.CurrentLevel % adsFrequency == 0) && (ad != null)  && (ad.State == InterstitialAdState.Ready))
            {
                GameState.Instance.SetState(GameState.GameStatus.PlayingAdvertisement);
                SoundManager.Instance.PauseBackgroundMusic();
                ad.Show();
                
            }
            else
#endif
            {                
                SoundManager.Instance.PlayWin();
            }
        }
        else if (e.NewState == GameState.GameStatus.AdvertisementCompleted || 
                 e.NewState == GameState.GameStatus.WinCompleted)
        {
            if (e.NewState == GameState.GameStatus.AdvertisementCompleted) 
                SoundManager.Instance.UnPauseBackgroundMusic();

            int next = GameState.Instance.GetNextLevel();
            boardManager.InstantiateLevel(next, GameState.Instance.GetLevel(next), new MonsterGame.DefaultMazeConfig(boardManager.transform.position));
            GotoGetReady();
            HandleLevelCompleted(next);
        } 
        else if (e.NewState == GameState.GameStatus.Paused)
        {
#if USEPAUSE
            if (!isPauseShowing && hasGameStarted )
            {
                Debug.Log("Show pause");
                Application.LoadLevelAdditive("Pause");
                isPauseShowing = true;  
            }
#endif
        }
        else if (e.NewState == GameState.GameStatus.WinCompleted)
        {
           
        }
        else if (e.NewState == GameState.GameStatus.LifeLostCompleted)
        {
            Debug.Assert(GameState.Instance.HasLives);
            boardManager.UseNextLive();
            GotoGetReady();
        }
        else if (e.NewState == GameState.GameStatus.GameOverCompleted)
        {
            GoBack();
        }


        if (e.OldState == GameState.GameStatus.Paused)
        {
#if USEPAUSE
            if (isPauseShowing)
            {
                Application.UnloadLevel("Pause");
            } 
            isPauseShowing = false;
#endif
        } 

        
    }
 void adCompeted(object ununsed)
 {
     ad.Dispose();
     ad = null; 
 }