Unity3D实现模型淡入淡出效果的方法-创新互联

这篇文章主要讲解了Unity3D实现模型淡入淡出效果的方法,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。

创新互联建站公司2013年成立,是专业互联网技术服务公司,拥有项目成都网站建设、成都网站制作网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元尼木做网站,已为上家服务,为尼木各地企业和个人服务,联系电话:028-86922220

开发中我们不仅需要UI界面淡入淡出,有时候还需要模型淡入淡出。我们在面板上修改color的a值时发现并没有效果。那是因为我们设置的RenderingMode是Opaque。官方标准shader中的Opaque pass段是不能显示半透明效果的,所以我们需要设置RenderingMode为Fade或者Transparent。然后在修改color的a值,达到淡入淡出的效果。效果如下:

Unity3D实现模型淡入淡出效果的方法

通常我们淡入一个模型只会传入这个模型的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 materials = new List();
 
 public FadeModel(GameObject model,float fadeTime=2f)
 {
 this.model = model;
 this.fadeTime = fadeTime;
 MeshRenderer[] meshRenderers = model.GetComponentsInChildren();
 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;
 }
 }
 
 
}

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


文章题目:Unity3D实现模型淡入淡出效果的方法-创新互联
转载注明:http://azwzsj.com/article/cddjgd.html