时间:2021-05-20
开发中我们不仅需要UI界面淡入淡出,有时候还需要模型淡入淡出。我们在面板上修改color的a值时发现并没有效果。那是因为我们设置的RenderingMode是Opaque。官方标准shader中的Opaque pass段是不能显示半透明效果的,所以我们需要设置RenderingMode为Fade或者Transparent。然后在修改color的a值,达到淡入淡出的效果。效果如下:
通常我们淡入一个模型只会传入这个模型的GameObject,所以我们自写一个类来处理这个模型淡入的一些事件。代码如下:
using System.Collections;using System.Collections.Generic;using UnityEngine;using DG.Tweening; public class FadeModel { private GameObject model;//传入的模型 private float fadeTime = 2f;//默认淡入时间为2s private List<Material> materials = new List<Material>(); public FadeModel(GameObject model,float fadeTime=2f) { this.model = model; this.fadeTime = fadeTime; MeshRenderer[] meshRenderers = model.GetComponentsInChildren<MeshRenderer>(); foreach(MeshRenderer mr in meshRenderers) { Material[] materals = mr.materials; foreach(Material m in materals) { if (!materials.Contains(m)) { materials.Add(m); } } } }//隐藏模型的淡隐效果 public void HideModel() { for(int i=0;i< materials.Count;i++) { Material m = materials[i]; Color color = m.color; m.color = new Color(color.r, color.g, color.b, 1);//这里一定要重新设置下Fade模式下的color a值 为1 不然 经过一次显示他会一直显示为0 setMaterialRenderingMode(m,RenderingMode.Fade); m.DOColor(new Color(color.r, color.g, color.b, 0), fadeTime); } }//当我们隐藏完后还需要设置回来 不然他下次显示使用就是透明状态 public void ShowModel() { for (int i = 0; i < materials.Count; i++) { Material m = materials[i]; Color color = m.color; setMaterialRenderingMode(m, RenderingMode.Opaque); } } public enum RenderingMode { Opaque, Cutout, Fade, Transparent } //设置材质的渲染模式 这段在我之前的博客有讲 代码设置渲染模式 private void setMaterialRenderingMode(Material material, RenderingMode renderingMode) { switch (renderingMode) { case RenderingMode.Opaque: material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One); material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero); material.SetInt("_ZWrite", 1); material.DisableKeyword("_ALPHATEST_ON"); material.DisableKeyword("_ALPHABLEND_ON"); material.DisableKeyword("_ALPHAPREMULTIPLY_ON"); material.renderQueue = -1; break; case RenderingMode.Cutout: material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One); material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero); material.SetInt("_ZWrite", 1); material.EnableKeyword("_ALPHATEST_ON"); material.DisableKeyword("_ALPHABLEND_ON"); material.DisableKeyword("_ALPHAPREMULTIPLY_ON"); material.renderQueue = 2450; break; case RenderingMode.Fade: material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha); material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha); material.SetInt("_ZWrite", 0); material.DisableKeyword("_ALPHATEST_ON"); material.EnableKeyword("_ALPHABLEND_ON"); material.DisableKeyword("_ALPHAPREMULTIPLY_ON"); material.renderQueue = 3000; //material.SetFloat("" _Mode & quot;", 2); break; case RenderingMode.Transparent: material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One); material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha); material.SetInt("_ZWrite", 0); material.DisableKeyword("_ALPHATEST_ON"); material.DisableKeyword("_ALPHABLEND_ON"); material.EnableKeyword("_ALPHAPREMULTIPLY_ON"); material.renderQueue = 3000; break; } } }我们在构造函数里传入模型,然后我们获取到这个模型下所有的材质球添加到一个材质球数组里用来管理控制。还要引入Dotween插件哦。我们是用的Dotween来做的淡出效果。然后我们就可以在我们需要的地方来调用淡出效果了。
public class Test : MonoBehaviour { public GameObject model; FadeModel fadeModel; // Use this for initialization void Start () { fadeModel = new FadeModel(model); fadeModel.HideModel(); } private void OnDisable() { fadeModel.ShowModel(); }}在编辑器模式测试的时候,我们在结束测试的时候要改回来渲染模式,不然在结束编辑器运行的时候模型显示的是半透明模式。编辑器不给你还原之前的状态。同理,在我们淡出模型之后要设置回来模型的渲染模式,不然在下次进入该场景使用该模型的时候,模型的渲染方式是Fade就出现错误啦。
我在用人物做这个淡出效果测试时发现效果很不好。半透明效果有时候会让后面的辫子渲染到前面了。所以对于精细显示的效果我们还是去求助我们的shader程序员吧,让他写一个贴图消融的shader。但是对于工业级别的粗糙显示,我们这个方案还是完全够用的。
还有一个,我们在获取一个物体下的所有组件时,使用的代码是:
MeshRenderer[] meshRenderers = model.GetComponentsInChildren<MeshRenderer>();当时当我们model下的子物体setactive是false的时候是不能被找到的。如果我们也想找到这些物体,我们就需要在上面代码括号里加一个true。如下:
MeshRenderer[] meshRenderers = model.GetComponentsInChildren<MeshRenderer>(true);以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例为大家分享了Unity3D实现图片循环淡入淡出的具体代码,供大家参考,具体内容如下1、说明由于近期项目需求,在网上找了淡入淡出的代码,但都是两张图片淡入
本文实例为大家分享了Unity实现背景图片淡入淡出的具体代码,供大家参考,具体内容如下如题。背景是两个图片,每隔一段时间图片1淡出,2淡入,然后2淡出,1淡入很
本文实例讲述了javascript淡入淡出焦点图幻灯片效果。分享给大家供大家参考。具体如下:这是一款基于javascript实现的淡入淡出焦点图幻灯片效果代码,
本文实例讲述了jquery实现经典的淡入淡出选项卡效果代码。分享给大家供大家参考。具体如下:这是一款经典的Tab选项卡代码,带有淡入淡出效果,jquery插件实
本文实例讲述了jquery实现的淡入淡出下拉菜单效果。分享给大家供大家参考。具体如下:这是一款jQuery带有淡入淡出效果的下拉菜单,可作为一个下拉导航菜单的模