- Home /
Need help getting the screen to fade.
I'm trying to get the screen to darken when I start the game and when I restart. I have followed a tutorial for this but was not very clear.
public class ScreenFader : MonoBehaviour {
// Holds the texutre to fill the screen
[SerializeField] Texture2D fadeTexture;
[SerializeField] Color colorStart = Color.black;
[SerializeField] Color colorEnd = Color.clear;
// Time to completion to fade
[SerializeField]float fadeTime = 1.0f;
// The container for the functions to be triggered when the fade has complete
private event FadeCompleteEvent OnFadeComplete = null;
// Defines the type of function which is used as a delegate
public delegate void FadeCompleteEvent();
// Internally used to track the passage of time
private float timer = 0.0f;
// Loads a prefab and create an instance from it
static public void CreateFade (string _prefabName,
FadeCompleteEvent _completeEvent) {
// Load the asset as a basic object
Object fadePrefab = Resources.Load(_prefabName, typeof(Object));
// Create a new game object from the loaded prefab
GameObject fadeObject = Instantiate( fadePrefab) as GameObject;
// Find the fader's script component an assign the event
ScreenFader fader = fadeObject.GetComponent<ScreenFader>();
fader.OnFadeComplete = _completeEvent;
}
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
// Accumulate the passage of time
timer += Time.fixedDeltaTime;
// Duration has been satisfied?
if (timer > fadeTime)
{
timer = fadeTime;
}
if (OnFadeComplete != null)
{
OnFadeComplete();
OnFadeComplete = null;
Destroy(gameObject, 0.1f);
}
}
void OnGui() {
// Determine the passage of time as
// a precentage of the duration time
float percent = timer / fadeTime;
// Use the percentage to the determine the
// gradient between the two
GUI.color = Color.Lerp(colorStart, colorEnd, percent);
// Create a rectangle the size of the screen
Rect screenRectangle = new Rect(0, 0, Screen.width, Screen.height);
// Draw the texture filling the entire screen
GUI.DrawTexture(screenRectangle, fadeTexture);
}
}
public class CoreGame : MonoBehaviour {
[SerializeField] GameObject pauseMenu;
// Stores the current pause state; private bool paused = false;
// Use this for initialization
void Start () {
ScreenFader.CreateFade("ScreenFadeUp", FadeUpCompleted);
// Hide the pause menu intitially
HandlePause(false);
}
// Update is called once per frame
void Update () {
// Exit early if paused
if (paused)
{
return;
}
CheckInput();
}
static public void MakeChild(GameObject _child) {
GameObject coreGameObj = GameObject.Find("CoreGame");
// Assign the child's transform's parent to the
// recently found core game's transform
_child.transform.parent = coreGameObj.transform;
}
void CheckInput()
{
// User has pressed pause?
if (Input.GetKeyUp(KeyCode.P))
{
HandlePause(!paused);
}
}
// Method to modify pause status
private void SetPaused(bool _paused)
{
paused = _paused;
}
void FadeUpCompleted() {
Debug.Log("Fade UP has completed!");
}
// Handles the actions of the pause event
public void HandlePause(bool _pause) {
paused = _pause;
// Send a message to all children
BroadcastMessage("SetPaused", paused);
paused = !paused;
Debug.Log("Pause Key has been pressed!");
if (paused)
{
Time.timeScale = 0;
}
else
{
Time.timeScale = 1;
}
pauseMenu.SetActive(paused);
}
}
public class PauseResume : MenuButtonBase {
// reference to the core game object
public CoreGame coreGame;
// Call on button up
protected override void doButtonAction()
{
coreGame.HandlePause(false);
}
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
}
public class PauseRestart : MenuButtonBase {
// Called on button up
protected override void doButtonAction()
{
ScreenFader.CreateFade("ScreenFadeDown", FadeDownCompleted);
}
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
void FadeDownCompleted() {
Application.LoadLevel("Project");
}
}
This may help with your first issue, it is js but it does work so maybe it can help you a little, ignore the player prefs bit.link text
I was able to fix my second issue but I'm still having trouble with the screen fade. The only error I can find was this \Scripts\ScreenFader.cs(7,29): warning CS0649: Field 'ScreenFader.fadeTexture' is never assigned to, and will always have its default value null.
I already have a game object in a prefab folder that contains the fadeTexture and it is cloned in the hierarchy whenever I start the game.
Answer by TheShadyColombian · Oct 22, 2014 at 01:34 AM
try adding a GUI image that is black and animate it to change the alpha value, and make the script that changes the scene change the animation. contact me if you need more info, am i very happy to help!
Answer by DanielB89 · Oct 22, 2014 at 07:44 PM
I was able to fix it. OnFadeComplete = null; and Destroy(gameObject, 0.1f); where both inside the IF-statement and moving out of it fixed the issue.