合成类小游戏源码,UGUIImage透明渐变

合成类小游戏源码,UGUIImage透明渐变实现的相关代码

```cpp
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
//参考https://blog.csdn.net/qq_34537249/article/details/78264955
Shader "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置挂上钩

```cpp
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<Image>().material;
}

// Update is called once per frame
void Update()
{
//关联坐标 进行透明渐变
if (transform.localPosition.y > 0)
{

_Material.SetFloat("_AlphaRX", (50 - transform.localPosition.y)/50);
}

}
}

```

 


以上就是合成类小游戏源码,UGUIImage透明渐变实现的相关代码, 更多内容欢迎关注之后的文章

posted @ 2021-08-06 14:16  云豹科技-苏凌霄  阅读(454)  评论(0编辑  收藏  举报