Unity3D实现模型淡入淡出效果

 更新时间:2020年6月25日 10:37  点击:1490

开发中我们不仅需要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);

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持猪先飞。

[!--infotagslink--]

相关文章

  • 原生js实现fadein 和 fadeout淡入淡出效果

    js里面设置DOM节点透明度的函数属性:filter= "alpha(opacity=" + value+ ")"(兼容ie)和opacity=value/100(兼容FF和GG)。 先来看看设置透明度的兼容性代码: 复制代码 代码如下: function setOpacity(ele, opacity) { if (...2014-06-07
  • Unity3D UGUI实现翻书特效

    这篇文章主要为大家详细介绍了Unity3D UGUI实现翻书特效,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • jQuery实现图片文字淡入淡出效果

    这篇文章主要介绍了jQuery实现图片文字淡入淡出效果,需要的朋友可以参考下...2015-12-24
  • Unity3D使用GL实现图案解锁功能

    这篇文章主要为大家详细介绍了Unity3D使用GL实现图案解锁功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • Unity3D实现飞机大战游戏(1)

    这篇文章主要为大家详细介绍了Unity3D实现飞机大战游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-11-03
  • C#实现窗体淡入淡出效果的方法总结

    C#实现窗体淡入淡出效果的方法总结,需要的朋友可以参考一下...2020-06-25
  • Unity3D基于OnGUI实时显示FPS

    这篇文章主要介绍了Unity3D基于OnGUI实时显示FPS,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • Unity3D仿写Button面板事件绑定功能

    这篇文章主要为大家详细介绍了Unity3D仿写Button面板事件绑定功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • unity3D实现三维物体跟随鼠标

    这篇文章主要为大家详细介绍了unity3D实现三维物体跟随鼠标,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • Unity3D游戏开发数据持久化PlayerPrefs的用法详解

    在本篇文章里小编给大家整理了关于Unity3D游戏开发之数据持久化PlayerPrefs的使用的相关知识点内容,需要的朋友们参考下。...2020-06-25
  • unity3d调用手机或电脑摄像头

    这个是在网上看到的,经测试可以在电脑上运行,确实调用了本地摄像头。有需要的小伙伴可以参考下。...2020-06-25
  • Unity3D Shader实现镜子效果

    这篇文章主要为大家详细介绍了Unity3D Shader实现镜子效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • Unity3D实现待机状态图片循环淡入淡出

    这篇文章主要为大家详细介绍了Unity3D实现待机状态图片循环淡入淡出,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • Unity3D Shader实现动态屏幕遮罩

    这篇文章主要为大家详细介绍了Unity3D Shader实现动态屏幕遮罩效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • Unity3D使用UGUI开发原生虚拟摇杆

    这篇文章主要为大家详细介绍了Unity3D使用UGUI开发原生虚拟摇杆,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • Unity3D UGUI特效之Image高斯模糊效果

    这篇文章主要为大家详细介绍了Unity3D UGUI特效之Image高斯模糊效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • Unity3D实现物体闪烁效果

    这篇文章主要为大家详细介绍了Unity3D实现物体闪烁效果,类似霓虹灯、跑马灯、LED灯效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • Delphi实现窗口文字淡入淡出渐变效果的方法

    这篇文章主要介绍了Delphi实现窗口文字淡入淡出渐变效果,需要的朋友可以参考下...2020-06-30
  • Unity3D利用DoTween实现卡牌翻转效果

    这篇文章主要为大家详细介绍了Unity3D利用DoTween实现卡牌翻转效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • Unity3D实现分页系统

    这篇文章主要为大家详细介绍了Unity3D实现分页系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25