• Benvenuto in Making Videogames!
  • Dai sfogo alla tua fantasia!
  • Crea il tuo Videogioco!
Benvenuto ospite! Login Registrati




Valutazione discussione:
  • 0 voto(i) - 0 media
  • 1
  • 2
  • 3
  • 4
  • 5
Fade Screen script problem
#1
ho trovato online uno script che mi potesse aiutare a dare un effetto Fading quando una scena comincia o finisce
lo script, un po' modificato da me, è questo

Codice:
using UnityEngine;
using System.Collections;

public class Fade_Screen_Scene : MonoBehaviour
{
   public float fadeSpeed = 5.0F;  
   public GUITexture blackScreen;
   private bool sceneStarting = true;  

   void Awake()
   {
       blackScreen.pixelInset = new Rect (0f, 0f, Screen.width, Screen.height);
   }


   void Update()
   {
       if (sceneStarting == true)
       {
       StartScene();
       }
   }


   void FadeToClear()
   {
       blackScreen.color = Color.Lerp(blackScreen.color, Color.clear, fadeSpeed * Time.deltaTime);
   }


   void FadeToBlack()
   {
       blackScreen.color = Color.Lerp(blackScreen.color, Color.black, fadeSpeed * Time.deltaTime);
   }


   void StartScene()
   {
       FadeToClear();
       if (blackScreen.color.a == 0.0f)
       {
           blackScreen.color = Color.clear;
           blackScreen.enabled = false;
           sceneStarting = false;
       }
   }


   public void EndScene()
   {
       blackScreen.enabled = true;
       FadeToBlack();
   }
}
c'è un problema: quando la scena inizia, il Fade In funziona benissimo, ma quando premo il trigger che mi permette di attivare il public void EndScene (), il Fade Out non funziona
ho provato che il problema non è l'attivazione del void EndScene () perchè funziona, quello che non funziona è il Fade Out che dovrebbe essere presente all'interno del void FadeToBlack ()

qualcuno riuscirebbe a spiegarmi cosa c'è di sbagliato nello script?
 
#2
Mmm credo sia un problema di gui le gui devi metterle dentro un void onGUI , non ricordo se il nome e giusto ma e da un po che non le uso
 
#3
ho provato ma non cambia nulla
sapresti dirmi un esempio di come usare il void OnGUI? perché non vorrei che come lo uso io non va bene
 
#4
Prova con questo script che ho fatto 

Codice:
using UnityEngine;
using System.Collections;

public class Fade_Screen_Scene : MonoBehaviour
{
  public float fadeSpeed = 5.0F;  
  public Texture blackScreen;
  private bool sceneStarting = true;
  bool e = false;

  void Update()
  {
      if (sceneStarting == true)
      {
            StartScene();
      }
  }


  void OnGUI()
  {
       if(e)
       GUI.DrawTexture(new Rect(0,0, Screen.width, Screen.height), blackScreen);
  }
 
  void FadeToClear()
  {
       GUI.color = Color.Lerp(blackScreen.color, Color.clear, fadeSpeed * Time.deltaTime);
  }


  void FadeToBlack()
  {
       GUI.color = Color.Lerp(blackScreen.color, Color.black, fadeSpeed * Time.deltaTime);
  }


  void StartScene()
  {
      FadeToClear();
      GUI.color = Color.clear;
      StartCoroutine(whileToClear());
  }
 
  IEnumerator whileToClear()
  {
       while(GUI.color.a != 0.0f)
       {
           yield return new WaitForSeconds(0);
       }
       //Questo viene eseguito quando la condizione del while non è piu vera
       e = false;
      sceneStarting = false;
  }


  public void EndScene()
  {
      e = true;
      FadeToBlack();
  }
}

Nel campo "texture" devi inserire l'immagine, cancella la gui texture dalla scena e attacca questo script ad un oggetto qualsiasi
 
#5
mi dispiace ma non ha funzionata, ho provato pure a modificare qualche stringa ma nulla
sto iniziando a pensare che ci sia qualche funzione di unity che ancora non conosco
 
#6
Codice:
using UnityEngine;
using System.Collections;

public class Fade : MonoBehaviour
{
   public Texture2D FadeOutTexture;
   public float fadeSpeed = 0.8f;
   private int drawDepth = -1000;
   private float alpha = 1;
   public int fadeDir = -1;
   public float timeForFade = 1f;

   //Questo serve per la chiusura del livello, ovvero che lo schermo diventa nero
   public void FadeIn()
   {
       BeginFade(1);
   }

   //Questo per inizio livello quindi quando lo schermo passa da nero a trasparente
   public void FadeOut()
   {
       StartCoroutine(fadingOut(timeForFade));
   }

   //Questo non serve ad altro che fare un inizio livello senza fare prima FadeIn e poi FadeOut
   //infatti in questa funzione controlla lui se c'è bisogno di fare il FadeIn, nel caso lo fa
   //e dopo un tempo impostato da te fa anche il fadeOut, altrimenti se non c'è bisogno di fare
   //fadeIn fa direttamente il fadeOut senza farti aspettare, ti consiglio di creare un scena
   //vuota con una camera per poterlo testare per bene e capire il funzionamento.
   IEnumerator fadingOut(float t)
   {
       if (fadeDir == 1)
           t = 0;
       else BeginFade(1);
       yield return new WaitForSeconds(t);
       BeginFade(-1);
   }

   public float BeginFade(int direction)
   {
       fadeDir = direction;
       return (fadeSpeed);
   }

   void Update()
   {
       //Questi sono comandi per testing, ti conviene torglierli una volta testato il funzionamento
       if(Input.GetKeyDown(KeyCode.A))
       {
           FadeIn();
       }
       if (Input.GetKeyDown(KeyCode.S))
       {
           FadeOut();
       }
   }

   void OnGUI()
   {
       alpha += fadeDir * fadeSpeed * Time.deltaTime;
       alpha = Mathf.Clamp01(alpha);
       GUI.color = new Color(GUI.color.r, GUI.color.g, GUI.color.b, alpha);
       GUI.depth = drawDepth;
       GUI.DrawTexture(new Rect(0, 0, Screen.width, Screen.height), FadeOutTexture);
   }
}

Lo ho rifatto a modo mio adesso dovrebbe funzionare, leggi i commenti che ti ho lasciato nello script per capire per bene tutto Big Grin
 
#7
il tuo script mi ha aiutato parecchio ma non l'ho utilizzato, infatti ho capito cosa non andava nel mio script
praticamente non avevo notato che il void StartScene veniva chiamato ogni frame fino a quando lo schermo non diventava completamente trasparente, quindi alpha uguale a 0, ma appena veniva chiamato il void EndScene, inizialmente l'alpha diventava diverso da 0 e quindi il void StartScene veniva chiamato ancora una volta, non facendo terminare il void EndScene
lo script funzionante è questo:

Codice:
using UnityEngine;
using System.Collections;

public class Fade_Screen_Scene : MonoBehaviour
{
   public float fadeSpeed = 5.0F;
   public GUITexture blackScreen;
   public float delayEnding = 2.0F;

   private bool sceneStarting = true;
   private bool sceneEnding = false;
   private IEnumerator coroutine;

   void Awake()
   {
       blackScreen.pixelInset = new Rect(0f, 0f, Screen.width, Screen.height);
   }


   void OnGUI()
   {
       if (sceneStarting == true && sceneEnding == false)
       {
           StartScene();
       }
       else
       {
           EndScene();
       }
   }


   void FadeToClear()
   {
       blackScreen.color = Color.Lerp(blackScreen.color, Color.clear, fadeSpeed * Time.deltaTime);
   }


   void FadeToBlack()
   {
       blackScreen.color = Color.Lerp(blackScreen.color, Color.black, fadeSpeed * Time.deltaTime);
   }


   void StartScene()
   {
       FadeToClear();
       if (blackScreen.color.a == 0.0f)
       {
           blackScreen.color = Color.clear;
           blackScreen.enabled = false;
           sceneStarting = false;
       }
   }


   void EndScene()
   {
       blackScreen.enabled = true;
       FadeToBlack();
       if (blackScreen.color.a == 1.0f)
       {
           blackScreen.color = Color.black;
           blackScreen.enabled = false;
       }
   }

   public void CallEndScene()
   {
       coroutine = waitForEndScene(delayEnding);
       StartCoroutine(coroutine);
   }

   public IEnumerator waitForEndScene(float delayEnding)
   {
       yield return new WaitForSeconds(delayEnding);
       sceneEnding = true;
       StopCoroutine(coroutine);
   }
}
 
#8
Ok, allora chiudo Smile
 
  


Discussioni simili
Discussione Autore Risposte Letto Ultimo messaggio
  visual studio tools for unity problem antolepore 2 772 29-02-2016, 10:50 PM
Ultimo messaggio: antolepore

Vai al forum:


Browsing: 1 Ospite(i)