Unity 在渲染每个活动摄像机一个组件,用于在场景中创建特定视角的图像。输出绘制在屏幕上或捕获为纹理。 更多信息
查看 词汇表之前引发 beginCameraRendering 事件,每帧都会触发。如果摄像机处于非活动状态(例如,如果摄像机游戏对象的 **摄像机** 组件复选框未选中),Unity 不会为此摄像机引发 beginCameraRendering
事件。
订阅此事件的方法后,您可以在 Unity 渲染摄像机之前执行自定义逻辑。自定义逻辑的示例包括将额外的摄像机渲染到渲染纹理一种特殊类型的纹理,在运行时创建和更新。要使用它们,首先创建一个新的渲染纹理,并将您的一个摄像机指定为渲染到该纹理中。然后,您可以在材质中像使用普通纹理一样使用渲染纹理。 更多信息
查看 词汇表,并使用这些纹理创建平面反射或监控摄像机视图等效果。
RenderPipelineManager 类中的其他事件提供了更多自定义 URP 的方法。您还可以将本文中描述的原理应用于这些事件。
订阅 RenderPipelineManager 类中事件之一的方法。
在订阅的方法中,使用 ScriptableRenderer
实例的 EnqueuePass
方法将自定义渲染通道注入 URP 帧渲染。
示例代码
public class EnqueuePass : MonoBehaviour
{
[SerializeField] private BlurSettings settings;
private BlurRenderPass blurRenderPass;
private void OnEnable()
{
...
blurRenderPass = new BlurRenderPass(settings);
// Subscribe the OnBeginCamera method to the beginCameraRendering event.
RenderPipelineManager.beginCameraRendering += OnBeginCamera;
}
private void OnDisable()
{
RenderPipelineManager.beginCameraRendering -= OnBeginCamera;
blurRenderPass.Dispose();
...
}
private void OnBeginCamera(ScriptableRenderContext context, Camera cam)
{
...
// Use the EnqueuePass method to inject a custom render pass
cam.GetUniversalAdditionalCameraData()
.scriptableRenderer.EnqueuePass(blurRenderPass);
}
}
本示例演示如何订阅 beginCameraRendering
事件的方法。
要按照本示例中的步骤操作,请创建一个 使用 **通用项目模板** 的新 Unity 项目
在场景场景包含游戏的环境和菜单。可以将每个唯一的场景文件视为一个独特的关卡。在每个场景中,您放置环境、障碍物和装饰品,基本上是按部分设计和构建游戏。 更多信息
查看 词汇表中,创建一个立方体。将其命名为 Example Cube。
在您的项目中,创建一个 C# 脚本。将其命名为 URPCallbackExample
。
将以下代码复制并粘贴到脚本中。 ```C# using UnityEngine; using UnityEngine.Rendering;
public class URPCallbackExample : MonoBehaviour { // Unity 在启用此组件时自动调用此方法 private void OnEnable() { // 将 WriteLogMessage 作为 RenderPipelineManager.beginCameraRendering 事件的委托添加 RenderPipelineManager.beginCameraRendering += WriteLogMessage; }
// Unity calls this method automatically when it disables this component
private void OnDisable()
{
// Remove WriteLogMessage as a delegate of the RenderPipelineManager.beginCameraRendering event
RenderPipelineManager.beginCameraRendering -= WriteLogMessage;
}
// When this method is a delegate of RenderPipeline.beginCameraRendering event, Unity calls this method every time it raises the beginCameraRendering event
void WriteLogMessage(ScriptableRenderContext context, Camera camera)
{
// Write text to the console
Debug.Log($"Beginning rendering the camera: {camera.name}");
}
} `` > **注意**: 订阅事件时,您的处理程序方法(在本例中为
WriteLogMessage)必须接受事件委托中定义的参数。在本例中,事件委托为
RenderPipeline.BeginCameraRendering,它期望以下参数:
<ScriptableRenderContext, Camera>`。
将 URPCallbackExample
脚本附加到 Example Cube。
选择 **播放**。Unity 在每次 Unity 引发 beginCameraRendering
事件时,都会在控制台窗口一个 Unity 编辑器窗口,用于显示 Unity 或您自己的脚本生成的错误、警告和其他消息。 更多信息
查看 词汇表中打印脚本中的消息。
要引发对 OnDisable()
方法的调用:在播放模式下,选择 Example Cube 并清除脚本组件标题旁边的复选框。Unity 将 WriteLogMessage
从 RenderPipelineManager.beginCameraRendering
事件中取消订阅,并停止在控制台窗口中打印消息。
您可以通过场景中的任何游戏对象Unity 场景中的基本对象,可以表示角色、道具、场景、摄像机、路点等。游戏对象的功能由附加到它的组件定义。 更多信息
查看 词汇表将可脚本化的渲染通道注入场景中。这样可以让您更精确地控制渲染通道何时处于活动状态。但这意味着您必须在需要使用渲染通道的每个位置都有一个游戏对象注入渲染通道。因此,最好通过可脚本化的渲染器功能而不是通过游戏对象来注入项目中的任何常见效果。
当您通过任何游戏对象将可脚本化的渲染通道注入场景时,请务必考虑 URP 如何使用此脚本。第一个渲染可脚本化的渲染通道的摄像机将使用该渲染通道,并且该渲染通道仅应用于该摄像机。任何在第一个摄像机之后渲染的可脚本化的渲染通道将应用于的摄像机都不会渲染该效果。
例如,如果您有两个摄像机,并且您在 Update
方法中添加了可脚本化的渲染通道,则只有第一个渲染的摄像机使用可脚本化的渲染通道效果。这是因为第一个摄像机使用了该效果的实例。由于第二个摄像机在 Update
方法的下次调用之前渲染,因此无法使用可脚本化的渲染通道的第二个实例。因此,第二个摄像机不会将其输出应用来自可脚本化的渲染通道的效果。