1. 程式人生 > >unity 實現場景過度動畫

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