本文共 2863 字,大约阅读时间需要 9 分钟。
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'//参考https://blog.csdn.net/qq_34537249/article/details/78264955Shader "Unlit/ImageAlpha"{ Properties { [PerRendererData]_MainTex ("Texture", 2D) = "white" {} _AlphaLX("RangeAlphaLX",Float) = 0 _AlphaRX("RangeAlphaRX",Float) = 1 _AlphaTY("RangeAlphaTY",Float) = 1 _AlphaBY("RangeAlphaBY",Float) = 0 _AlphaPower("Power",Float) = 0 //透明度变化范围 } SubShader { Tags { "RenderType"="Transparent" } Blend SrcAlpha OneMinusSrcAlpha Cull Back Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; sampler2D _MainTex; float4 _MainTex_ST; float _AlphaPower; sampler2D _AlphaTex; float _AlphaLX; float _AlphaRX; float _AlphaTY; float _AlphaBY; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); return o; } //此方法取自Unity默认Sprite的Shader fixed4 SampleSpriteTexture (float2 uv) { fixed4 color = tex2D (_MainTex, uv);#if ETC1_EXTERNAL_ALPHA // get the color from an external texture (usecase: Alpha support for ETC1 on android) color.a = tex2D (_AlphaTex, uv).r;#endif //ETC1_EXTERNAL_ALPHA return color; } fixed4 frag (v2f i) : SV_Target { // sample the texture fixed4 col = SampleSpriteTexture(i.uv); //利用透明度阈值和uv坐标的差来计算透明的程度和是否控制其半透 //四个方向只是对坐标的取值和正反方向不同,原理一致 fixed alphalx = col.a * lerp(1,_AlphaPower,(_AlphaLX-i.uv.x)); col.a = saturate(lerp(alphalx,col.a,step(_AlphaLX,i.uv.x))); fixed alpharx = col.a * lerp(1,_AlphaPower,(i.uv.x-_AlphaRX)); col.a = saturate(lerp(col.a,alpharx,step(_AlphaRX,i.uv.x))); fixed alphaby = col.a * lerp(1,_AlphaPower,(_AlphaBY-i.uv.y)); col.a = saturate(lerp(alphaby,col.a,step(_AlphaBY,i.uv.y))); fixed alphaty = col.a * lerp(1,_AlphaPower,(i.uv.y-_AlphaTY)); col.a = saturate(lerp(col.a,alphaty,step(_AlphaTY,i.uv.y))); return col; } ENDCG } }}
初始_AlphaLX("RangeAlphaLX",Float) = 0
_AlphaRX("RangeAlphaRX",Float) = 1 _AlphaTY("RangeAlphaTY",Float) = 1 _AlphaBY("RangeAlphaBY",Float) = 0修改_AlphaTY可以达到从上到下逐渐渐变 其他也是如此需要
接着跟代码 位0置挂上钩
using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.UI;public class NewBehaviourScript : MonoBehaviour{ public float A = 0; public Material _Material; // Start is called before the first frame update void Start() { _Material = GetComponent().material; } // Update is called once per frame void Update() { //关联坐标 进行透明渐变 if (transform.localPosition.y > 0) { _Material.SetFloat("_AlphaRX", (50 - transform.localPosition.y)/50); } }}