unity 實現場景過度動畫
阿新 • • 發佈:2018-12-18
在專案開發中,有時候會需要一個過度動畫一來實現資料和資源的載入 ,二來就是是表現更加美觀,下面就具體說一種以黑色遮擋鍵入漸出的方式實現。
一、首先新建一個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