首先你要有兩個(gè)Camera,一個(gè)是場(chǎng)景相機(jī)钱床,一個(gè)是特效相機(jī)荚斯。
場(chǎng)景相機(jī)的Culling Mask設(shè)置為Player或Backgroud等等,它負(fù)責(zé)顯示角色和特效等所有和場(chǎng)景相關(guān)的對(duì)象查牌。
特效相機(jī)的Culling Mask設(shè)置為Effect事期,它只負(fù)責(zé)顯示要高亮的部分,無(wú)大招時(shí)它并不顯示任何對(duì)象纸颜。
在釋放大招時(shí)兽泣,動(dòng)態(tài)將Player和其他要高亮的對(duì)象(如特效)的Layer設(shè)置為Effect層, 這時(shí)特效相機(jī)就可以看到這些對(duì)象了懂衩,而場(chǎng)景相機(jī)無(wú)法看到這些物體了撞叨。最后是對(duì)場(chǎng)景相機(jī)作壓暗后處理, 其他對(duì)象和背景就變暗了浊洞!大招結(jié)束將這些處于高亮層的對(duì)象還原致原來(lái)的層中牵敷。
效果:
具體如何對(duì)場(chǎng)景對(duì)象作壓暗處理呢?
1.創(chuàng)建一個(gè)ScreenFade.shader
2.新建一個(gè)ScreenFade.cs 法希,將其掛到場(chǎng)景相機(jī)上枷餐,在釋放大招時(shí)開(kāi)啟。
大致表現(xiàn)是:持續(xù)5秒0.8alpha的變暗效果苫亦,5秒后會(huì)在2秒內(nèi)漸隱消失回到正常毛肋。具體時(shí)長(zhǎng)應(yīng)該是你的大招時(shí)長(zhǎng)!
Shader "Unlit/ScreenFade"
{
Properties{
_Color("Color", Color) = (0,0,0,1)
}
SubShader{
Tags{ "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Opaque" }
LOD 100
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
Color[_Color]
Pass{}
}
}
using UnityEngine;
using System.Collections;
public class ScreenFade : MonoBehaviour
{
public float lastTime = 5.0f;
public float fadeTime = 2.0f;
public Color fadeColor = new Color(0.01f, 0.01f, 0.01f, 1.0f);
private Material fadeMaterial = null;
private bool isFading = false;
private YieldInstruction fadeInstruction = new WaitForEndOfFrame();
void Awake()
{
fadeMaterial = new Material(Shader.Find("Unlit/ScreenFade"));
}
void OnEnable()
{
StartCoroutine(FadeIn());
}
void OnLevelWasLoaded(int level)
{
StartCoroutine(FadeIn());
}
void OnDestroy()
{
if (fadeMaterial != null)
{
Destroy(fadeMaterial);
}
}
IEnumerator FadeIn()
{
float elapsedTime = 0.0f;
fadeMaterial.color = fadeColor;
Color color = fadeColor;
isFading = true;
while (elapsedTime < lastTime)
{
yield return fadeInstruction;
elapsedTime += Time.deltaTime;
color.a = 0.8f;
fadeMaterial.color = color;
}
elapsedTime -= lastTime;
while (elapsedTime < fadeTime)
{
yield return fadeInstruction;
elapsedTime += Time.deltaTime;
color.a = color.a - Mathf.Clamp01(elapsedTime / fadeTime);
fadeMaterial.color = color;
}
isFading = false;
}
void OnPostRender()
{
if (isFading)
{
fadeMaterial.SetPass(0);
GL.PushMatrix();
GL.LoadOrtho();
GL.Color(fadeMaterial.color);
GL.Begin(GL.QUADS);
GL.Vertex3(0f, 0f, -12f);
GL.Vertex3(0f, 1f, -12f);
GL.Vertex3(1f, 1f, -12f);
GL.Vertex3(1f, 0f, -12f);
GL.End();
GL.PopMatrix();
}
}
}