Unity3D中UGUI不使用DOTween制作渐隐渐现效果

在做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

如下所示:

11 public class Text : MaskableGraphic, ILayoutElement 22 33 public abstract class MaskableGraphic : Graphic, IMaskable 44 55 public class Image : MaskableGraphic, ICanvasRaycastFilter, ISerializationCallbackReceiver, ILayoutElement

然后我们再阅读Graphic代码,我们会发现有两个方法

11 public void CrossFadeAlpha(float alpha, float duration, bool ignoreTimeScale); 22 public void CrossFadeColor(Color targetColor, float duration, bool ignoreTimeScale, bool useAlpha);

开源源码如下:

1 1 public void CrossFadeAlpha(float alpha, float duration, bool ignoreTimeScale) 2 2 { 3 3 CrossFadeColor(CreateColorFromAlpha(alpha), duration, ignoreTimeScale, true, false); 4 4 } 5 5 6 6 public void CrossFadeColor(Color targetColor, float duration, bool ignoreTimeScale, bool useAlpha) 7 7 { 8 8 CrossFadeColor(targetColor, duration, ignoreTimeScale, useAlpha, true); 9 9 } 1010 1111 private void CrossFadeColor(Color targetColor, float duration, bool ignoreTimeScale, bool useAlpha, bool useRGB) 1212 { 1313 if (canvasRenderer == null || (!useRGB && !useAlpha)) 1414 return; 1515 1616 Color currentColor = canvasRenderer.GetColor(); 1717 if (currentColor.Equals(targetColor)) 1818 return; 1919 2020 ColorTween.ColorTweenMode mode = (useRGB && useAlpha ? ColorTween.ColorTweenMode.All : (useRGB ? ColorTween.ColorTweenMode.RGB : ColorTween.ColorTweenMode.Alpha)); 2121 2222 var colorTween = new ColorTween {duration = duration, startColor = canvasRenderer.GetColor(), targetColor = targetColor}; 2323 colorTween.AddOnChangedCallback(canvasRenderer.SetColor); 2424 colorTween.ignoreTimeScale = ignoreTimeScale; 2525 colorTween.tweenMode = mode; 2626 m_ColorTweenRunner.StartTween(colorTween); 2727 }

因此我们利用CrossFadeColor或CrossFadeAlpha这两个方法就可以实现渐隐渐现了

下面是客户端调用代码

1 1 { 2 2 3 3 Component[] comps = GameObject.Find("/Canvas").GetComponentsInChildren<Component>(); 4 4 foreach (Component c in comps) 5 5 { 6 6 if (c is Graphic) 7 7 { 8 8 (c as Graphic).CrossFadeAlpha(0, 1, true); 9 9 } 1010 } 1111 }

执行的效果就是所有Canvas下的元素都在1秒之类执行淡出效果!

---上面原文:Unity4.6 UI实现渐隐渐现(FadeIn FadeOut)效果---

以下是我在实际项目中结合协程制作的提示信息闪烁功能实现

1 1   internal Coroutine noticeCor; 2 2 internal void ShowNotice() 3 3 { 4 4 HideNotice(); 5 5 noticeCor = StartCoroutine(NoticeShowScale()); 6 6 } 7 7 8 8 internal void HideNotice() 9 9 { 1010 if (null != noticeCor) 1111 { 1212 StopCoroutine(noticeCor); 1313 noticeItme.gameObject.SetActive(false); 1414 } 1515 } 1616 1717 IEnumerator NoticeShowScale() 1818 { 1919 noticeItem.gameObject.SetActive(true); 2020 float targetA = 1; 2121 noticeItem.GetComponent<CanvasRenderer>().SetAlpha(0); 2222 float timer = 0; 2323 while (timer<6f) 2424 { 2525 noticeItem.GetComponent<Graphic>().CrossFadeAlpha(targetA, 1, true); 2626 yield return new WaitForSeconds(1f); 2727 timer += 1f; 2828 targetA = targetA == 0 ? 1 : 0; 2929 } 3030 noticeItem.gameObject.SetActive(false); 3131 noticeCor = null; 3232 }
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )