在做UI后期設計時,我們可能要對UI做一些特效,這篇文章我們來學習下如何在Unity3d中對實現漸隱漸現的效果,
首先我們看下Unity New UI即UGUI中漸隱漸現的做法.
觀察我們會發現Unity4.6 UI中每個能夠顯示控件都會有一個CanvasRender對象,CanvasRender有什么作用呢,我們
看下官方的解釋:The Canvas Renderer component renders a graphical UI object contained within a Canvas.簡單的
翻譯過來就是,畫布上的渲染器組件將呈現包含在一個畫布內的圖形用戶界面對象,再仔細查看CanvasRenderer類
時我們可以看到有兩個方法SetAlpha ,SetColor,顯然我們可以修改透明度Alpha和Color來實現漸隱漸現,同時我
們還可以發現Button,Text,Image等控件都會集成自Unity.UI.Graphic
如下所示:
1 public class Text : MaskableGraphic, ILayoutElement 2 3 public abstract class MaskableGraphic : Graphic, IMaskable 4 5 public class Image : MaskableGraphic, ICanvasRaycastFilter, ISerializationCallbackReceiver, ILayoutElement
然后我們再閱讀Graphic代碼,我們會發現有兩個方法
1 public void CrossFadeAlpha(float alpha, float duration, bool ignoreTimeScale); 2 public void CrossFadeColor(Color targetColor, float duration, bool ignoreTimeScale, bool useAlpha);
開源源碼如下:
1 public void CrossFadeAlpha(float alpha, float duration, bool ignoreTimeScale) 2 { 3 CrossFadeColor(CreateColorFromAlpha(alpha), duration, ignoreTimeScale, true, false); 4 } 5 6 public void CrossFadeColor(Color targetColor, float duration, bool ignoreTimeScale, bool useAlpha) 7 { 8 CrossFadeColor(targetColor, duration, ignoreTimeScale, useAlpha, true); 9 } 10 11 private void CrossFadeColor(Color targetColor, float duration, bool ignoreTimeScale, bool useAlpha, bool useRGB) 12 { 13 if (canvasRenderer == null || (!useRGB && !useAlpha)) 14 return; 15 16 Color currentColor = canvasRenderer.GetColor(); 17 if (currentColor.Equals(targetColor)) 18 return; 19 20 ColorTween.ColorTweenMode mode = (useRGB && useAlpha ? ColorTween.ColorTweenMode.All : (useRGB ? ColorTween.ColorTweenMode.RGB : ColorTween.ColorTweenMode.Alpha)); 21 22 var colorTween = new ColorTween {duration = duration, startColor = canvasRenderer.GetColor(), targetColor = targetColor}; 23 colorTween.AddOnChangedCallback(canvasRenderer.SetColor); 24 colorTween.ignoreTimeScale = ignoreTimeScale; 25 colorTween.tweenMode = mode; 26 m_ColorTweenRunner.StartTween(colorTween); 27 }
因此我們利用CrossFadeColor或CrossFadeAlpha這兩個方法就可以實現漸隱漸現了
下面是客戶端調用代碼
1 { 2 3 Component[] comps = GameObject.Find("/Canvas").GetComponentsInChildren<Component>(); 4 foreach (Component c in comps) 5 { 6 if (c is Graphic) 7 { 8 (c as Graphic).CrossFadeAlpha(0, 1, true); 9 } 10 } 11 }
執行的效果就是所有Canvas下的元素都在1秒之類執行淡出效果!
---上面原文:Unity4.6 UI實現漸隱漸現(FadeIn FadeOut)效果---
以下是我在實際項目中結合協程制作的提示信息閃爍功能實現
1 internal Coroutine noticeCor; 2 internal void ShowNotice() 3 { 4 HideNotice(); 5 noticeCor = StartCoroutine(NoticeShowScale()); 6 } 7 8 internal void HideNotice() 9 { 10 if (null != noticeCor) 11 { 12 StopCoroutine(noticeCor); 13 noticeItme.gameObject.SetActive(false); 14 } 15 } 16 17 IEnumerator NoticeShowScale() 18 { 19 noticeItem.gameObject.SetActive(true); 20 float targetA = 1; 21 noticeItem.GetComponent<CanvasRenderer>().SetAlpha(0); 22 float timer = 0; 23 while (timer<6f) 24 { 25 noticeItem.GetComponent<Graphic>().CrossFadeAlpha(targetA, 1, true); 26 yield return new WaitForSeconds(1f); 27 timer += 1f; 28 targetA = targetA == 0 ? 1 : 0; 29 } 30 noticeItem.gameObject.SetActive(false); 31 noticeCor = null; 32 }