FadeObjectInOut
From Unify Community Wiki
(Difference between revisions)
(→C# - FadeObjectInOut.cs) |
(→Description) |
||
Line 5: | Line 5: | ||
This allows you to easily fade an object and its children. | This allows you to easily fade an object and its children. | ||
If an object is already partially faded it will continue from there. | If an object is already partially faded it will continue from there. | ||
− | If you choose a different speed, it will use the new speed. | + | If you choose a different speed, it will use the new speed. |
+ | |||
+ | It's especially useful for GUI style objects, but can be used on 3D objects in the scene as well. | ||
==Usage== | ==Usage== |
Revision as of 08:55, 7 December 2012
Author: Hayden Scott-Baron (Dock)
Contents |
Description
This allows you to easily fade an object and its children. If an object is already partially faded it will continue from there. If you choose a different speed, it will use the new speed.
It's especially useful for GUI style objects, but can be used on 3D objects in the scene as well.
Usage
Place this script on the gameobject you wish to fade, and call 'FadeIn()' or 'FadeOut()'. Adjust fading time with 'FadeIn(4.0f)', or by adjusting the public time variable.
Technical Discussion
This requires objects to have materials that allow for alpha transparency.
C# - FadeObjectInOut.cs
/* FadeObjectInOut.cs Hayden Scott-Baron (Dock) - http://starfruitgames.com 6 Dec 2012 This allows you to easily fade an object and its children. If an object is already partially faded it will continue from there. If you choose a different speed, it will use the new speed. NOTE: Requires materials with a shader that allows transparency through color. */ using UnityEngine; using System.Collections; public class FadeObjectInOut : MonoBehaviour { // publically editable speed public float fadeTime = 0.5f; public bool fadeInOnStart = false; public bool fadeOutOnStart = false; // store colours private Color[] colors; // allow automatic fading on the start of the scene IEnumerator Start () { yield return null; if (fadeInOnStart) FadeIn(fadeTime); if (fadeOutOnStart) FadeOut(fadeTime); } // check the alpha value of most opaque object float MaxAlpha() { float maxAlpha = 0.0f; Renderer[] rendererObjects = GetComponentsInChildren<Renderer>(); foreach (Renderer item in rendererObjects) { maxAlpha = Mathf.Max (maxAlpha, item.material.color.a); } return maxAlpha; } // fade sequence IEnumerator FadeSequence (float fadingOutTime) { // log fading direction, then precalculate fading speed as a multiplier bool fadingOut = (fadingOutTime < 0.0f); float fadingOutSpeed = 1.0f / fadingOutTime; // grab all child objects Renderer[] rendererObjects = GetComponentsInChildren<Renderer>(); if (colors == null) { //create a cache of colors if necessary colors = new Color[rendererObjects.Length]; // store the original colours for all child objects for (int i = 0; i < rendererObjects.Length; i++) { colors[i] = rendererObjects[i].material.color; } } // make all objects visible for (int i = 0; i < rendererObjects.Length; i++) { rendererObjects[i].enabled = true; } // get current max alpha float alphaValue = MaxAlpha(); // iterate to change alpha value while ( (alphaValue >= 0.0f && fadingOut) || (alphaValue <= 1.0f && !fadingOut)) { alphaValue += Time.deltaTime * fadingOutSpeed; for (int i = 0; i < rendererObjects.Length; i++) { Color newColor = (colors != null ? colors[i] : rendererObjects[i].material.color); newColor.a = Mathf.Min ( newColor.a, alphaValue ); newColor.a = Mathf.Clamp (newColor.a, 0.0f, 1.0f); rendererObjects[i].material.SetColor("_Color", newColor) ; } yield return null; } // turn objects off after fading out if (fadingOut) { for (int i = 0; i < rendererObjects.Length; i++) { rendererObjects[i].enabled = false; } } } void FadeIn () { FadeIn (fadeTime); } void FadeOut () { FadeOut (fadeTime); } void FadeIn (float newFadeTime) { StopAllCoroutines(); StartCoroutine("FadeSequence", newFadeTime); } void FadeOut (float newFadeTime) { StopAllCoroutines(); StartCoroutine("FadeSequence", -newFadeTime); } // These are for testing only. Comment out to try fading in and out! // void Update() // { // if (Input.GetKeyDown (KeyCode.Alpha0) ) // { // FadeIn(); // } // if (Input.GetKeyDown (KeyCode.Alpha9) ) // { // FadeOut(); // } // } }