unity 实现场景过度动画

版权声明:本文为博主原创文章,未经博主允许不得转载。 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

猜你喜欢

转载自blog.csdn.net/yu1368072332/article/details/83589705