Unity3D实现模型淡入淡出效果

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

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

(0)

相关推荐

  • Unity实现背景图片淡入淡出效果

    本文实例为大家分享了Unity实现背景图片淡入淡出的具体代码,供大家参考,具体内容如下 如题. 背景是两个图片, 每隔一段时间  图片1 淡出,2 淡入, 然后2淡出,1 淡入 很简单 首先Unity建立两个 image1, image2.  image1 在上面显示 然后  我们设置 image1 的透明度, 就是1 淡出, 2淡入. 代码如下: using UnityEngine; using System.Collections; using UnityEngine.UI; public

  • Unity3D实现模型淡入淡出效果

    开发中我们不仅需要UI界面淡入淡出,有时候还需要模型淡入淡出.我们在面板上修改color的a值时发现并没有效果.那是因为我们设置的RenderingMode是Opaque.官方标准shader中的Opaque pass段是不能显示半透明效果的,所以我们需要设置RenderingMode为Fade或者Transparent.然后在修改color的a值,达到淡入淡出的效果.效果如下: 通常我们淡入一个模型只会传入这个模型的GameObject,所以我们自写一个类来处理这个模型淡入的一些事件.代码如下

  • 基于jquery实现的文字淡入淡出效果

    复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  <html xmlns="http://www.w3.org/1999/xhtml">  <head>  <meta http-equiv=

  • jQuery实现可兼容IE6的淡入淡出效果告警提示功能示例

    本文实例讲述了jQuery实现可兼容IE6的淡入淡出效果告警提示功能.分享给大家供大家参考,具体如下: 其实我觉得告警提示的话,直接用一个Alert就最好的.开门见山,直接让用户明白你当前系统的意思,关键是Alert这东西就是再破的浏览器都必须兼容,不然你它丫的做毛浏览器啊?但是,在现在越来越觉得Alert不美观,而且开始有"弹窗挺吓人"的思潮,因此,告警提示你必须做得好看一点.在Javascript的透明度的操控比较艰难的前提下,jQuery的简单淡入淡出效果是你的选择.之所以选择j

  • js实现图片加载淡入淡出效果

    本文实例为大家分享了js图片加载淡入淡出效果展示的具体代码,供大家参考,具体内容如下 HTML代码 首先是图片标记的写法: <img data-src="/path/to/image.jpg" alt=""> 需要将图片的地址放到 data-src 属性里,而src值填写默认的一张图片. CSS代码 所有具有data-src属性的图片,我们将其初始显示状态为不可见,通过透明度来调节: img { opacity: 1; transition: opaci

  • js如何实现淡入淡出效果

    淡入淡出效果,在日常项目中经常用到,可惜原生JS没有类似的方法,而有时小的页面并不值得引入一个jQuery库,所以就自己写了一个,已封装,有用得着的朋友,可以直接使用.代码中另附有一个设置元素透明度的方法, 是按IE规则(0~100)设置, 若改成标准设置方法(0.00~1.00),,下面使用时请考虑浮点精确表达差值. 参数说明: fadeIn()与fadeOut()均有三个参数,第一个是事件, 必填:第二个是淡入淡出速度,正整数,大小自己权衡,可选参数:第三个, 是指定淡入淡出到的透明度值(类

  • 纯js实现图片匀速淡入淡出效果

    图片匀速淡入淡出效果如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>淡入效果</title> <style> * { margin: 0; padding: 0; } div { border: 2px solid #aaa; } img { width: 300px; height:

  • jQuery实现首页图片淡入淡出效果的方法

    本文实例讲述了jQuery实现首页图片淡入淡出效果的方法.分享给大家供大家参考.具体分析如下: 这里演示当当网的品牌店铺首页效果,演示地址为:http://static.dangdang.com/gm/topic/2270_181320.shtml 效果图如下所示: 需求: 1. 绿色区域要求在图片上方,半透明显示 2. 当鼠标移动到红色区域,切换相应的图片 3. 首页的三张大图轮转 HTML: <div id="carousel"> <div id="ca

  • 基于jQuery实现最基本的淡入淡出效果实例

    本文实例讲述了基于jQuery实现最基本的淡入淡出效果的方法.分享给大家供大家参考.具体分析如下: jQuery是一个JavaScript 库,也就是对JavaScript的扩展,用来满足各种日益增加的不同特效需求.其实质就是JavaScript 下面来编写一个最基本的JQ程序来说明JQ. 一.基本目标 网页中有如下三个按钮,一个只能隐藏文本,一个只能显示文本,一个同时能隐藏与显示文本,点击一下显示,再点击一下隐藏,无限循环.如下图所示: 二.制作过程 1.首先你要到JQ官网中下载一个JQ支持文

  • jquery淡入淡出效果简单实例

    本文实例讲述了jquery淡入淡出效果实现方法.分享给大家供大家参考,具体如下: 之前理解有一些误区,以为淡入淡出是删除该元素,其实只是把该元素隐藏起来 和 显示出来罢了. 具体代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xml

  • jQuery实现图片文字淡入淡出效果

    本实例主要讲解了jquery仿新浪微博图片文字列表上下淡进淡出间歇上下滚动效果,分享给大家供大家参考,具体内容如下 1.效果及功能说明 仿新浪微博图片文字列表上下淡进淡出间歇上下滚动 2.实现原理 首先要设定div内只能显示4个图片那么多出来的图片会自动隐藏然后在给图片添加一个动画的事件让他们可以滚动的播放出来上下滚动效果播放就是li标签里面的内容图片和文字把每一个li看成一个整体在滚动播放的时候进入div内的显示出来在最后离开div的时候隐藏在给整个动画效果设定一个时间就可以完整的运行. 3.

随机推荐