国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Unity中C#使用協(xié)程控制Shader材質(zhì)變化

這篇具有很好參考價值的文章主要介紹了Unity中C#使用協(xié)程控制Shader材質(zhì)變化。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。


前言

在上一篇文章實現(xiàn)了C#腳本簡單修改Shader材質(zhì)的效果后,我們使用按鈕點擊結(jié)合協(xié)程來實現(xiàn)一下游戲中角色常見的效果:受擊、中毒、消融效果

我們繼續(xù)使用上一篇的 Shader 和 C# 腳本來繼續(xù)測試

  • Unity中C#如何訪問并修改Shader材質(zhì)

一、協(xié)程是什么

Unity中的協(xié)程可以理解為 C# 中多線程的作用,在主線程運行的同時,把一些不確定時間的步驟并行操作,不影響主線程。但是協(xié)程 和 C#的多線程不一樣。

協(xié)程模擬了多線程的作用,但是不是真正意義上的多線程

Unity中C#使用協(xié)程控制Shader材質(zhì)變化,Unity,unity,c#,材質(zhì)


二、在Unity中使用協(xié)程

1、我們在 Start 中測試一下協(xié)程的執(zhí)行順序

  • 我們定義一個協(xié)程在控制臺 等待 2 秒 輸出 2

IEnumerator Wait()
{
yield return new WaitForSeconds(2);
Debug.Log(2);
}

  • 在 Start 按如下順序輸出

Debug.Log(1);
//這里使用協(xié)程輸出一個 2
StartCoroutine(Wait());
Debug.Log(3);

  • 我們運行一下看看輸出的順序

Unity中C#使用協(xié)程控制Shader材質(zhì)變化,Unity,unity,c#,材質(zhì)

控制臺先輸出了1、3 間隔了兩秒輸出了 2

2、我們實現(xiàn)一個點擊按鈕實現(xiàn)角色受擊效果

  • 我們使用協(xié)程實現(xiàn)一個改變顏色后 間隔 0.15 秒恢復(fù)原本顏色的效果

IEnumerator WaitBehit()
{
skr.sharedMaterial.SetColor("_Color", Color.red);
yield return new WaitForSeconds(0.15f);
skr.sharedMaterial.SetColor("_Color",Color.white);
}

  • 在 GUI 繪制時,給按鈕點擊后加上 角色受擊后的協(xié)程

void OnGUI()
{
if (GUI.Button(new Rect(10, 10, 150, 50), “被擊”))
{
StartCoroutine(WaitBehit());
}
}

我們來測試看一下效果:

Unity中C#使用協(xié)程控制Shader材質(zhì)變化,Unity,unity,c#,材質(zhì)


三、協(xié)程中的動畫過渡

主要實現(xiàn)一個角色中毒后中毒消散的效果

1、首先,在協(xié)程內(nèi)實現(xiàn)中毒并且消散的效果

  • 在協(xié)程內(nèi)定義一個計數(shù)器,作為顏色過度的控制器
  • 在協(xié)程內(nèi)使用死循環(huán),實現(xiàn)計數(shù)器的累加
  • 在協(xié)程內(nèi)使用 Color.Lerp(A,B,x);實現(xiàn)顏色過度效果
  • 把該過度顏色賦值給我們的小狐貍
IEnumerator WaitMethysis()
    {
        float _time = 0;
        Color color;
        while (true)
        {
            _time += Time.deltaTime;
            yield return new WaitForEndOfFrame();
            color = Color.Lerp(Color.green, Color.white,_time / 2);
            skr.sharedMaterial.SetColor("_Color",color );
            if (_time >= 2)
            {
                yield break;
            }
        }
    }

2、在 OnGUI 內(nèi),給一個新按鈕使用剛剛定義的協(xié)程

if (GUI.Button(new Rect(10,70,150,50),“中毒”))
{
StartCoroutine(WaitMethysis());
}

我們來測試一下看看效果:
Unity中C#使用協(xié)程控制Shader材質(zhì)變化,Unity,unity,c#,材質(zhì)

在開啟一個協(xié)程時,記著停止協(xié)程

//關(guān)閉指定協(xié)程
StopCoroutine(string);
//關(guān)閉所有協(xié)程
StopAllCoroutines();


四、C#控制Shader變體開關(guān) 開啟死亡消融效果變體

1、C# 怎么開啟和關(guān)閉 Shader變體

  • 開啟關(guān)鍵字

material.EnableKeyword(string);

  • 關(guān)閉關(guān)鍵字

material.DisableKeyword(string);

  • 這里的關(guān)鍵字不是Shader屬性面板的屬性名,是在Shader的Pass中的變體名

2、在協(xié)程中開啟死亡消融變體及實現(xiàn)效果

  • 先在協(xié)程中定義一個_time 計數(shù)器
  • 開啟死亡消融變體
  • 使用 while 給計數(shù)器累加,作為消融的控制值
  • 修改_Clip 屬性值實現(xiàn)消融
IEnumerator WaitDead(float time)
    {
        float _time = 0;

        while (true)
        {
            _time += Time.deltaTime;
            yield return new WaitForEndOfFrame();
           
            skr.sharedMaterial.EnableKeyword("_DISSOLVEENABLE_ON");
            skr.sharedMaterial.SetFloat("_Clip",_time / time);
            
            if (_time >=time)
            {
                skr.sharedMaterial.SetFloat("_Clip",0);
                skr.sharedMaterial.DisableKeyword("_DISSOLVEENABLE_ON");
                yield break;
            }
        }
    }

3、在OnGUI中,定義一個新按鈕調(diào)用死亡協(xié)程

if (GUI.Button(new Rect(10,130,150,50),“死亡消融”))
{
StopAllCoroutines();
StartCoroutine(WaitDead(2));
}

我們來測試一下看看效果:
Unity中C#使用協(xié)程控制Shader材質(zhì)變化,Unity,unity,c#,材質(zhì)文章來源地址http://www.zghlxwxcb.cn/news/detail-756953.html


五、測試代碼

Shader:

//角色消融效果
Shader "MyShader/P2_5_6"
{
    Properties
    {
        //使用這個標(biāo)簽,可以使外部暴露屬性,有標(biāo)題
        [Header(Base)]
        [NoScaleOffset]_MainTex ("Texture", 2D) = "white" {}
        _Color("Color",Color) = (1,1,1,1)
        _Clip("Clip",Range(0,1)) = 0
        //使用這個標(biāo)簽可以 在兩行暴露屬性之間加 間隙
        [Space(10)]
        [Header(Dissolve)]
        [Toggle]_DissolveEnable("Dissolve Enable",int) = 0
        _DissolveTex("DissolveTex",2D) = "black"{}

        [NoScaleOffset]_RampTex("RampTex(RGB)",2D) = "black" {}

    }
    SubShader
    {
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            //定義消融變體開關(guān)
            #pragma shader_feature _ _DISSOLVEENABLE_ON 
            #include "UnityCG.cginc"
            
            sampler2D _MainTex;
            fixed4 _Color;
            float _Clip;
            sampler2D _DissolveTex; 
            //這個四維向量,xyzw分別表示 Tilling 和 Offset 的 xy ,命名方式 在紋理名 后加 _ST
            float4 _DissolveTex_ST;


            //因為 在使用漸變紋理時,只使用了 漸變紋理的 u 坐標(biāo),所以把  sampler2D 換位 sampler
            sampler _RampTex;

            struct appdata
            {
                float4 vertex : POSITION;
                float4 uv : TEXCOORD0;
            };

            struct v2f
            {
                float4 uv : TEXCOORD0;
                float4 pos : SV_POSITION;
            };

            v2f vert (appdata v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                
                //為了減少傳入的值 ,所以就不創(chuàng)建新變量來存儲,而是把 uv 改為  四維向量 來用
                //使用 o.uv 的 xy 來存放 原人物貼圖
                //使用 o.uv 的 zw 來存放 噪波貼圖縮放 和 偏移 后的值
                o.uv.xy = v.uv.xy;
                //o.uv.zw = v.uv * _DissolveTex_ST.xy + _DissolveTex_ST.zw;

                o.uv.zw = TRANSFORM_TEX(v.uv,_DissolveTex);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                fixed4 col = tex2D(_MainTex, i.uv.xy);
                col *= _Color;
                #if _DISSOLVEENABLE_ON
                //外部獲取的 紋理 ,使用前都需要采樣
                fixed4 dissolveTex = tex2D(_DissolveTex,i.uv.zw);
                
                //片段的取舍
                clip(dissolveTex.r -  _Clip);

                //進行歸一化
                fixed4 dissolveValue = saturate((dissolveTex.r - _Clip) / (_Clip + 0.1 - _Clip));

                fixed4 rampTex = tex1D(_RampTex,dissolveValue.r);

                col += rampTex;
                #endif
                
                return col;
            }
            ENDCG
        }
    }
}



C#腳本:

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

//C#如何訪問并且修改材質(zhì)屬性
public class P2_5_6 : MonoBehaviour
{
    #region [成員變量]

    public GameObject Fox;
    private SkinnedMeshRenderer skr;

    #endregion
    #region [Start/Update]
    void Start()
    {
        skr = Fox.GetComponentInChildren<SkinnedMeshRenderer>();
    }
    void Update()
    {
    }
    #endregion
    #region [GUI]
    void OnGUI()
    {
        if (GUI.Button(new Rect(10, 10, 150, 50), "被擊"))
        {
            StopAllCoroutines();
            StartCoroutine(WaitBehit());
        }

        if (GUI.Button(new Rect(10,70,150,50),"中毒"))
        {
            StopAllCoroutines();
            StartCoroutine(WaitMethysis(2));
        }

        if (GUI.Button(new Rect(10,130,150,50),"死亡消融"))
        {
            StopAllCoroutines();
            StartCoroutine(WaitDead(2));
        }
    }
    #endregion

    #region [受擊]

    IEnumerator WaitBehit()
    {
        skr.sharedMaterial.SetColor("_Color", Color.red);
        yield return new WaitForSeconds(0.15f);
        skr.sharedMaterial.SetColor("_Color",Color.white);
    }
    #endregion

    #region [中毒]
    IEnumerator WaitMethysis(float time)
    {
        float _time = 0;
        Color color;
        while (true)
        {
            _time += Time.deltaTime;
            yield return new WaitForEndOfFrame();
            color = Color.Lerp(Color.green, Color.white,_time / time);
            skr.sharedMaterial.SetColor("_Color",color );
            if (_time >= time)
            {
                yield break;
            }
        }
    }
    #endregion

    #region [死亡消融]
    IEnumerator WaitDead(float time)
    {
        float _time = 0;

        while (true)
        {
            _time += Time.deltaTime;
            yield return new WaitForEndOfFrame();
           
            skr.sharedMaterial.EnableKeyword("_DISSOLVEENABLE_ON");
            skr.sharedMaterial.SetFloat("_Clip",_time / time);
            
            if (_time >=time)
            {
                skr.sharedMaterial.SetFloat("_Clip",0);
                skr.sharedMaterial.DisableKeyword("_DISSOLVEENABLE_ON");
                yield break;
            }
        }
    }
    #endregion
}

到了這里,關(guān)于Unity中C#使用協(xié)程控制Shader材質(zhì)變化的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【unity】C#協(xié)程IEnumerator的使用(下)

    在Unity中,使用協(xié)程可以很方便地實現(xiàn)延時執(zhí)行,即在一定的時間后執(zhí)行某個代碼塊。例如,我們可

    2024年02月01日
    瀏覽(20)
  • Unity中Shader的Standard材質(zhì)解析(二)

    Unity中Shader的Standard材質(zhì)解析(二)

    Unity中Shader的Standard材質(zhì)解析(二),對 Standard 的 PBR 的 GI 進行解析 Unity中Shader的Standard材質(zhì)解析(一) #include “CGInclude/MyPhysicallyBasedRendering.cginc” 整理 LightingStandard_GI1(o, giInput, gi); 中的數(shù)據(jù) Unity_GlossyEnvironmentData表示GI中的反射準(zhǔn)備數(shù)據(jù) 準(zhǔn)備好反射數(shù)據(jù)后,計算得出GI中的

    2024年02月04日
    瀏覽(21)
  • 【Unity Shader】從入門到著魔(1)基本概念:什么是網(wǎng)格?材質(zhì)?Shader?

    【Unity Shader】從入門到著魔(1)基本概念:什么是網(wǎng)格?材質(zhì)?Shader?

    如上圖,模型的三角形面就叫做網(wǎng)格(Mesh),網(wǎng)格的本質(zhì)是一堆頂點數(shù)據(jù)的規(guī)則排序,在Unity和UE中由三角形表示,Maya等DCC軟件(Digital Content Creation)中則通常由四邊形表示(倆個三角形剛好組成一個四邊形)。 在Unity中我們新建一個Cube,

    2024年02月09日
    瀏覽(24)
  • Unity | Shader(著色器)和material(材質(zhì))的關(guān)系

    Unity | Shader(著色器)和material(材質(zhì))的關(guān)系

    一、前言 在上一篇文章中 【精選】Unity | Shader基礎(chǔ)知識(什么是shader)_unity shader_菌菌巧樂茲的博客-CSDN博客 我們講了什么是shader,今天我們講一下shder和material的關(guān)系 二、在unity中shader的本質(zhì) unity中,shader就是一串代碼,如下圖shader(就是一個平平無奇的shader) 但是,這個sh

    2024年02月02日
    瀏覽(22)
  • 【Unity Shader】從入門到領(lǐng)悟(1)基本概念:什么是網(wǎng)格?什么是材質(zhì)和Shader?

    【Unity Shader】從入門到領(lǐng)悟(1)基本概念:什么是網(wǎng)格?什么是材質(zhì)和Shader?

    如上圖,模型的三角形面就叫做網(wǎng)格(Mesh),網(wǎng)格的本質(zhì)是一堆頂點數(shù)據(jù)的規(guī)則排序,在Unity和UE中由三角形表示,Maya等DCC軟件(Digital Content Creation)中則通常由四邊形表示(倆個三角形剛好組成一個四邊形)。 在Unity中我們新建一個Cube,

    2024年02月06日
    瀏覽(21)
  • 【Unity Shader】從入門到感慨(1)基本概念:什么是網(wǎng)格?什么是材質(zhì)和Shader?

    【Unity Shader】從入門到感慨(1)基本概念:什么是網(wǎng)格?什么是材質(zhì)和Shader?

    如上圖,模型的三角形面就叫做網(wǎng)格(Mesh),網(wǎng)格的本質(zhì)是一堆頂點數(shù)據(jù)的規(guī)則排序,在Unity和UE中由三角形表示,Maya等DCC軟件(Digital Content Creation)中則通常由四邊形表示(倆個三角形剛好組成一個四邊形)。 在Unity中我們新建一個Cube,

    2024年02月11日
    瀏覽(22)
  • Unity3D中的C#協(xié)程(概念、使用方法、底層原理)

    ???????? Unity3D 中的協(xié)程是針對 Unity3D 框架和 C# 編程語言定制的 ,具有便捷的使用方式和良好的效率。其他語言Python、Lua等也支持協(xié)程,但是底層實現(xiàn)的細節(jié)可能不同。在 Unity3D 引擎中, 協(xié)程被 Unity3D?引擎的主循環(huán)所驅(qū)動 。 ????????協(xié)程(Coroutine)是一種編程概念

    2024年02月08日
    瀏覽(27)
  • 【unity shader】水體渲染基礎(chǔ)-基于texture distortion的流體流動材質(zhì)

    【unity shader】水體渲染基礎(chǔ)-基于texture distortion的流體流動材質(zhì)

    當(dāng)液體靜止時,它在視覺上與固體沒有太大區(qū)別。 但大多數(shù)時候,我們的性能不一定支持去實現(xiàn)特別復(fù)雜的水物理模擬, 需要的只是在常規(guī)的靜態(tài)材料的表面上讓其運動起來。我們可以對網(wǎng)格的 UV 坐標(biāo)實現(xiàn)動態(tài)變化,從而讓表面的紋理效果實現(xiàn)變形的動態(tài)變化。 1.1. uv實時

    2024年02月03日
    瀏覽(28)
  • 【Unity100個實用小技巧】如何修改UI上材質(zhì)的Shader

    【Unity100個實用小技巧】如何修改UI上材質(zhì)的Shader

    ??博客主頁:CSDN博客主頁 ??本文由 萌萌的小木屋 原創(chuàng),首發(fā)于 CSDN ?? ??學(xué)習(xí)專欄推薦:面試匯總 ??游戲框架專欄推薦:游戲?qū)嵱每蚣軐???點贊 ?? 收藏 ?留言 ??,如有錯誤請指正 ?? 未來很長,值得我們?nèi)Ρ几案篮玫纳? ------------------??分割線?

    2024年02月14日
    瀏覽(41)
  • Unity Shader:常用的C#與shader交互的方法

    Unity Shader:常用的C#與shader交互的方法

    ? 俗話說久病成醫(yī),雖然不是專業(yè)技術(shù)美術(shù),但代碼寫久了自然會積累一些常用的shader交互方法。零零散散的,總結(jié)如下: ? 有時候我們需要改變ui的一些屬性,從而實現(xiàn)想要的效果。通常UGUI上有如下屬性,而我們想要改變,就需要獲取到Material這個屬性: ? 這里拿Image來舉

    2024年02月14日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包