Unity3D實現(xiàn)模型淡入淡出效果
開發(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é)
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/4862.html
您可能感興趣的文章
- 01-10C#實現(xiàn)txt定位指定行完整實例
- 01-10WinForm實現(xiàn)仿視頻 器左下角滾動新聞效果的方法
- 01-10C#實現(xiàn)清空回收站的方法
- 01-10C#實現(xiàn)讀取注冊表監(jiān)控當前操作系統(tǒng)已安裝軟件變化的方法
- 01-10C#實現(xiàn)多線程下載文件的方法
- 01-10C#實現(xiàn)Winform中打開網(wǎng)頁頁面的方法
- 01-10C#實現(xiàn)遠程關(guān)閉計算機或重啟計算機的方法
- 01-10C#自定義簽名章實現(xiàn)方法
- 01-10C#文件斷點續(xù)傳實現(xiàn)方法
- 01-10winform實現(xiàn)創(chuàng)建最前端窗體的方法


閱讀排行
本欄相關(guān)
- 01-10C#通過反射獲取當前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實現(xiàn)txt定位指定行完整實例
- 01-10WinForm實現(xiàn)仿視頻 器左下角滾動新
- 01-10C#停止線程的方法
- 01-10C#實現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實現(xiàn)讀取注冊表監(jiān)控當前操作系統(tǒng)已
隨機閱讀
- 01-10C#中split用法實例總結(jié)
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-11ajax實現(xiàn)頁面的局部加載
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 04-02jquery與jsp,用jquery
- 01-10delphi制作wav文件的方法
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10SublimeText編譯C開發(fā)環(huán)境設置
- 01-10使用C語言求解撲克牌的順子及n個骰子