最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2020年04月16日 09:09:50   作者:JayW就是我吖  
這篇文章主要為大家詳細(xì)介紹了Unity3D實(shí)現(xiàn)模型淡出效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

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

通常我們淡入一個(gè)模型只會(huì)傳入這個(gè)模型的GameObject,所以我們自寫(xiě)一個(gè)類來(lái)處理這個(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)過(guò)一次顯示他會(huì)一直顯示為0
 setMaterialRenderingMode(m,RenderingMode.Fade);
 m.DOColor(new Color(color.r, color.g, color.b, 0), fadeTime);
 }
 }
//當(dāng)我們隱藏完后還需要設(shè)置回來(lái) 不然他下次顯示使用就是透明狀態(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;
 }
 }
 
 
}

我們?cè)跇?gòu)造函數(shù)里傳入模型,然后我們獲取到這個(gè)模型下所有的材質(zhì)球添加到一個(gè)材質(zhì)球數(shù)組里用來(lái)管理控制。還要引入Dotween插件哦。我們是用的Dotween來(lái)做的淡出效果。然后我們就可以在我們需要的地方來(lái)調(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();
 }
}

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

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

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

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

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

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 深入Ref,Out的理解及其使用

    深入Ref,Out的理解及其使用

    本篇文章是對(duì)Ref與Out進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • 實(shí)例詳解C#正則表達(dá)式

    實(shí)例詳解C#正則表達(dá)式

    這篇文章主要通過(guò)實(shí)例詳解C#正則表達(dá)式的相關(guān)資料,需要的朋友可以參考下
    2016-01-01
  • C#版的 Escape() 和 Unescape() 函數(shù)分享

    C#版的 Escape() 和 Unescape() 函數(shù)分享

    從網(wǎng)上看到兩個(gè)方法, C# 版的 Escape() 和 Unescape(),收藏下。
    2011-05-05
  • C# 位運(yùn)算符整理

    C# 位運(yùn)算符整理

    在C#中可以對(duì)整型運(yùn)算對(duì)象按位進(jìn)行邏輯運(yùn)算。按位進(jìn)行邏輯運(yùn)算的意義是:依次取被運(yùn)算對(duì)象的每個(gè)位,進(jìn)行邏輯運(yùn)算,每個(gè)位的邏輯運(yùn)算結(jié)果是結(jié)果值的每個(gè)位。
    2008-10-10
  • C#多線程用法詳解

    C#多線程用法詳解

    本文詳細(xì)講解了C#多線程用法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • c# asp .net 動(dòng)態(tài)創(chuàng)建sql數(shù)據(jù)庫(kù)表的方法

    c# asp .net 動(dòng)態(tài)創(chuàng)建sql數(shù)據(jù)庫(kù)表的方法

    c# asp .net 動(dòng)態(tài)創(chuàng)建sql數(shù)據(jù)庫(kù)表的方法,需要的朋友可以參考一下
    2013-04-04
  • C#獲取Windows10屏幕縮放比例的操作方法

    C#獲取Windows10屏幕縮放比例的操作方法

    這篇文章主要介紹了C#獲取Windows10屏幕的縮放比例,接下來(lái)介紹如何獲取Display?resolution中顯示的實(shí)際分辨率,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2021-12-12
  • C#上位機(jī)與三菱PLC通訊的實(shí)現(xiàn)步驟(圖文)

    C#上位機(jī)與三菱PLC通訊的實(shí)現(xiàn)步驟(圖文)

    這篇文章主要介紹了C#上位機(jī)與三菱PLC通訊的實(shí)現(xiàn)步驟(圖文),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • WPF實(shí)現(xiàn)頁(yè)面的切換的示例代碼

    WPF實(shí)現(xiàn)頁(yè)面的切換的示例代碼

    本文主要介紹了WPF實(shí)現(xiàn)頁(yè)面的切換的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • c#正反序列化XML文件示例(xml序列化)

    c#正反序列化XML文件示例(xml序列化)

    這篇文章主要介紹了c#正反序列化XML文件示例,可以將對(duì)象序列化為XML文本或者文件,或者將XML文件或文本反序列化為對(duì)象,要求進(jìn)行序列化的對(duì)象不能出現(xiàn)序列化異常,支持類的嵌套,要求類的屬性為public
    2014-03-03

最新評(píng)論

乌兰县| 延津县| 托克托县| 梁平县| 南昌市| 昌都县| 华池县| 札达县| 万源市| 资兴市| 福鼎市| 乐山市| 衡南县| 扬中市| 察雅县| 广西| 濮阳市| 宣武区| 大足县| 武城县| 祁连县| 江都市| 筠连县| 馆陶县| 嘉黎县| 金秀| 娄烦县| 抚松县| 红桥区| 东光县| 当涂县| 高青县| 莱阳市| 金坛市| 西安市| 青川县| 临安市| 军事| 会昌县| 平阳县| 论坛|