欧美大屁股bbbbxxxx,狼人大香伊蕉国产www亚洲,男ji大巴进入女人的视频小说,男人把ji大巴放进女人免费视频,免费情侣作爱视频

歡迎來到入門教程網(wǎng)!

C#教程

當前位置:主頁 > 軟件編程 > C#教程 >

Unity3D實現(xiàn)模型淡入淡出效果

來源:本站原創(chuàng)|時間:2020-01-10|欄目:C#教程|點擊: 次

開發(fā)中我們不僅需要UI界面淡入淡出,有時候還需要模型淡入淡出。我們在面板上修改color的a值時發(fā)現(xiàn)并沒有效果。那是因為我們設置的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 不然 經(jīng)過一次顯示他會一直顯示為0
 setMaterialRenderingMode(m,RenderingMode.Fade);
 m.DOColor(new Color(color.r, color.g, color.b, 0), fadeTime);
 }
 }
//當我們隱藏完后還需要設置回來 不然他下次顯示使用就是透明狀態(tài)
 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
 }
 //設置材質(zhì)的渲染模式 這段在我之前的博客有講 代碼設置渲染模式
 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;
 }
 }
 
 
}

我們在構(gòu)造函數(shù)里傳入模型,然后我們獲取到這個模型下所有的材質(zhì)球添加到一個材質(zhì)球數(shù)組里用來管理控制。還要引入Dotween插件哦。我們是用的Dotween來做的淡出效果。然后我們就可以在我們需要的地方來調(diào)用淡出效果了。

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();
 }
}

在編輯器模式測試的時候,我們在結(jié)束測試的時候要改回來渲染模式,不然在結(jié)束編輯器運行的時候模型顯示的是半透明模式。編輯器不給你還原之前的狀態(tài)。同理,在我們淡出模型之后要設置回來模型的渲染模式,不然在下次進入該場景使用該模型的時候,模型的渲染方式是Fade就出現(xiàn)錯誤啦。

我在用人物做這個淡出效果測試時發(fā)現(xiàn)效果很不好。半透明效果有時候會讓后面的辮子渲染到前面了。所以對于精細顯示的效果我們還是去求助我們的shader程序員吧,讓他寫一個貼圖消融的shader。但是對于工業(yè)級別的粗糙顯示,我們這個方案還是完全夠用的。

還有一個,我們在獲取一個物體下的所有組件時,使用的代碼是:

MeshRenderer[] meshRenderers = model.GetComponentsInChildren<MeshRenderer>();

當時當我們model下的子物體setactive是false的時候是不能被找到的。如果我們也想找到這些物體,我們就需要在上面代碼括號里加一個true。如下:

MeshRenderer[] meshRenderers = model.GetComponentsInChildren<MeshRenderer>(true);

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持我們。

上一篇:c#定期刪除文件的實操方法

欄    目:C#教程

下一篇:C#比較日期的方法總結(jié)

本文標題:Unity3D實現(xiàn)模型淡入淡出效果

本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/4862.html

網(wǎng)頁制作CMS教程網(wǎng)絡編程軟件編程腳本語言數(shù)據(jù)庫服務器

如果侵犯了您的權(quán)利,請與我們聯(lián)系,我們將在24小時內(nèi)進行處理、任何非本站因素導致的法律后果,本站均不負任何責任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有