unity 实现场景过度动画

 

 

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

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

Unity场景切换过渡动画可以通过使用Animator Controller来实现。Animator Controller可以管理不同的动画动画之间的切换。比如,在角色身上有走、跑、跳、蹲的动画,可以使用Animator Controller来轻松管理它们。即使只有一段动画,仍然需要给动画物体添加Animator组件才能播放动画。 在Unity中,可以使用Motion设置一个Animation Clip来创建动画。如果已经有动画了,可以从工程中选择动画。 在Animator Controller中,有不同的裁剪模式可供选择。其中,Always Animate模式表示动画将始终运行,即使物体在屏幕外被裁剪掉并没有渲染。Cull Update Transforms模式表示当物体不可见时,禁用Retarget、IK、Transforms的更新。Cull Completely模式表示当物体不可见时,完全禁用动画控制器。 通过设置Animator Controller和使用适当的裁剪模式,可以实现Unity场景切换过渡动画。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Unity动画系统详解3:如何播放、切换动画?](https://blog.youkuaiyun.com/zhenghongzhi6/article/details/106459895)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值