版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yu1368072332/article/details/83589705
在项目开发中,有时候会需要一个过度动画一来实现数据和资源的加载 ,二来就是是表现更加美观,下面就具体说一种以黑色遮挡键入渐出的方式实现。
一、首先新建一个shader,实现可以根据半径来改变当前的颜色信息:
float4 frag(v2f_img i) : COLOR
{
float x = i.uv.x*(_ScreenParams.x / _ScreenParams.y);
float y = i.uv.y;
float dis = sqrt((x - _Center_X)*(x - _Center_X) + (y - _Center_Y)*(y - _Center_Y));
//在半径区域 修改颜色 达到屏幕黑色效果
if (dis > _Radius)
{
float4 col = (0, 0, 0, 0);
return col;
}
return tex2D(_MainTex, i.uv);
}
ENDCG
}
}
二、创建一个脚本实现动态改变shader中的半径
1.修改相机的设置
gameObject.GetComponent<Camera>().useOcclusionCulling = true; //控制相机的设置
2.创建材质球,渲染图片的后期处理效果
void Start()
{
if (ma == null)
{
ma = new Material(Shader.Find("MyShader/BlackScreen")); //创建一个新的材质球
}
}
//所有渲染完成后被调用,来渲染图片的后期处理效果 https://docs.unity3d.com/ScriptReference/MonoBehaviour.OnRenderImage.html
void OnRenderImage(RenderTexture source, RenderTexture destination)
{
Graphics.Blit(source, destination, ma);
}
3.动态改变半径:
IEnumerator ChangeEffect()
{
if (ma == null)
{
yield return 0;
}
//修改shader中的半径 达到黑色区域缩小的效果
while (ma.GetFloat("_Radius") >= 0)
{
count = ma.GetFloat("_Radius") - ChangeSpeed * Time.deltaTime;
ma.SetFloat("_Radius", count);
yield return 0;
}
//屏幕缩小之后处理传入的事件
if (act_CallBack != null)
{
act_CallBack();
}
//中间等待时间
yield return new WaitForSeconds(waitTime);
//放大过程
while (ma.GetFloat("_Radius") <= 1.5)
{
count = ma.GetFloat("_Radius") + ChangeSpeed * Time.deltaTime;
ma.SetFloat("_Radius", count);
yield return 0;
}
gameObject.GetComponent<Camera>().useOcclusionCulling = false;
yield return 0;
}
最后通过测试按钮调用,过度场景动画
void OnGUI()
{
if (GUI.Button(new Rect(10, 10, 100, 40), "Test"))
{
UiCamera.useOcclusionCulling = true;
SceneFadeInOut fade = UiCamera.GetComponent<SceneFadeInOut>();
if (fade == null)
{
fade = UiCamera.gameObject.AddComponent<SceneFadeInOut>();
}
fade.StartFadeScene();
}
}
实现效果
工程地址:链接:https://pan.baidu.com/s/1fsrgjHBTgw8ARWtaLv-ZTg 提取码:nxwj
想了解更多unity相关知识,可以关注下方公众号,或者添加QQ群:879354767