国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

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

2020-01-24 00:08:53
字體:
供稿:網(wǎng)友

開發(fā)中我們不僅需要UI界面淡入淡出,有時(shí)候還需要模型淡入淡出。我們在面板上修改color的a值時(shí)發(fā)現(xiàn)并沒有效果。那是因?yàn)槲覀冊O(shè)置的RenderingMode是Opaque。官方標(biāo)準(zhǔn)shader中的Opaque pass段是不能顯示半透明效果的,所以我們需要設(shè)置RenderingMode為Fade或者Transparent。然后在修改color的a值,達(dá)到淡入淡出的效果。效果如下:

通常我們淡入一個(gè)模型只會傳入這個(gè)模型的GameObject,所以我們自寫一個(gè)類來處理這個(gè)模型淡入的一些事件。代碼如下:

using System.Collections;using System.Collections.Generic;using UnityEngine;using DG.Tweening; public class FadeModel {  private GameObject model;//傳入的模型 private float fadeTime = 2f;//默認(rèn)淡入時(shí)間為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);//這里一定要重新設(shè)置下Fade模式下的color a值 為1 不然 經(jīng)過一次顯示他會一直顯示為0 setMaterialRenderingMode(m,RenderingMode.Fade); m.DOColor(new Color(color.r, color.g, color.b, 0), fadeTime); } }//當(dāng)我們隱藏完后還需要設(shè)置回來 不然他下次顯示使用就是透明狀態(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 } //設(shè)置材質(zhì)的渲染模式 這段在我之前的博客有講 代碼設(shè)置渲染模式 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ù)里傳入模型,然后我們獲取到這個(gè)模型下所有的材質(zhì)球添加到一個(gè)材質(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(); }}

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

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

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

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

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

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 佳木斯市| 鸡西市| 墨脱县| 库伦旗| 静安区| 刚察县| 耿马| 湖北省| 武川县| 云安县| 施甸县| 涟源市| 庆元县| 莆田市| 珲春市| 株洲县| 曲阜市| 宾川县| 泸定县| 延长县| 平潭县| 安宁市| 苏尼特右旗| 霍州市| 吉首市| 大荔县| 麻栗坡县| 社旗县| 得荣县| 天峨县| 阳泉市| 东丰县| 朝阳县| 拜泉县| 开阳县| 四子王旗| 巫溪县| 青河县| 和林格尔县| 梓潼县| 宜州市|