在实际开发中,屏幕后期效果常常需要动态创建,而且参数会随时间变化。下面我就来研究怎么在Post Processing Stack中怎么动态创建后期处理效果。
本文资源可以通过这里链接访问:https://man_man.coding.net/p/PostProcessStackExample/git
1 首先是要在摄像机上创建Post-process Layer组件,和上一篇提到的相同,这里不再赘述。
2 我们提供了一种QuickVolume方法来快速生成场景中的Volumn。
public PostProcessVolume QuickVolume(int layer, float priority, params PostProcessEffectSettings[] settings)
前两个参数是不言自明的。最后一个参数是一个数组或一个你想在这个Volumn中覆盖的效果列表。
安装一个新的效果是相当直接的。例如,创建一个Vignette效果,并覆盖它的启用和强度字段。
var vignette = ScriptableObject.CreateInstance<Vignette>();
vignette.enabled.Override(true);
vignette.intensity.Override(1f);
现在我们来看看一个稍微复杂一点的效果。我们想完全从脚本中创建一个脉动的光斑效果。
using UnityEngine;
using UnityEngine.Rendering.PostProcessing;
public class VignettePulse : MonoBehaviour
{
PostProcessVolume m_Volume;
Vignette m_Vignette;
void Start()
{
m_Vignette = ScriptableObject.CreateInstance<Vignette>();
m_Vignette.enabled.Override(true);
m_Vignette.intensity.Override(1f);
m_Volume = PostProcessManager.instance.QuickVolume(gameObject.layer, 100f, m_Vignette);
}
void Update()
{
m_Vignette.intensity.value = Mathf.Sin(Time.realtimeSinceStartup);
}
void OnDestroy()
{
RuntimeUtilities.DestroyVolume(m_Volume, true, true);
}
}
这段代码创建一个新的虚影,并将其分配给一个新生成的Volumn,优先级为100。然后,在每一帧中,它使用正弦曲线来改变vignette的强度。
重要的是。当你不再需要时,不要忘记销毁Volumn和附加的配置文件。
Fading Volumes
基于距离的Volumn混合对于大多数关卡设计的使用情况来说是很好的,但是偶尔你会想根据游戏事件触发一个淡入和/或淡出效果。你可以在上一节中描述的Update方法中手动完成,或者你也可以使用一个Tweening库来为你完成所有的工作。其中有几个是Unity免费提供的,比如DOTween、iTween或LeanTween。
让我们在这个例子中使用DOTween。我们不会详细介绍它(它已经有一个很好的文档),但这应该能让你入门。
using UnityEngine;
using UnityEngine.Rendering.PostProcessing;
using DG.Tweening;
public class VignettePulse : MonoBehaviour
{
void Start()
{
var vignette = ScriptableObject.CreateInstance<Vignette>();
vignette.enabled.Override(true);
vignette.intensity.Override(1f);
var volume = PostProcessManager.instance.QuickVolume(gameObject.layer, 100f, vignette);
volume.weight = 0f;
DOTween.Sequence()
.Append(DOTween.To(() => volume.weight, x => volume.weight = x, 1f, 1f))
.AppendInterval(1f)
.Append(DOTween.To(() => volume.weight, x => volume.weight = x, 0f, 1f))
.OnComplete(() =>
{
RuntimeUtilities.DestroyVolume(volume, true, true);
Destroy(this);
});
}
}
在这个例子中,和上一个例子一样,我们生成了一个带vignette的快速Volumn。我们把它的weight属性设置为0,因为我们不希望它有任何贡献。
然后,我们使用DOTween的排序功能来串联一组tweening事件:淡入,暂停一秒钟,淡出,最后销毁Volumn和组件本身。
当然,你也可以对单个效果属性进行调节,而不是对整个Volumn进行调节。
补充说明:
如果你需要在运行时实例化PostProcessLayer,你需要确保资源被正确绑定到它。在组件被添加后,不要忘记调用Init()作为参数引用PostProcessResources文件。
var postProcessLayer = gameObject.AddComponent<PostProcessLayer>();
postProcessLayer.Init(resources);