在项目开发中,有时候会需要一个过度动画一来实现数据和资源的加载 ,二来就是是表现更加美观,下面就具体说一种以黑色遮挡键入渐出的方式实现。

一、首先新建一个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