使用 beginCameraRendering 事件
本页的示例将展示如何使用 beginCameraRendering 事件来运行自定义方法。
beginCameraRendering 事件概述
Unity 在每一帧中渲染每个活动摄像机之前会引发一个 beginCameraRendering
事件。如果摄像机处于非活动状态(例如,如果摄像机游戏对象上的 Camera 组件复选框被清除),Unity 不会引发此摄像机的 beginCameraRendering
事件。
当您订阅此事件的方法时,您可以在 Unity 渲染摄像机之前执行自定义逻辑。自定义逻辑的示例包括渲染额外的摄像机以渲染纹理,并将这些纹理用于平面反射或监控摄像机视图等效果。
RenderPipelineManager 类中的其他事件提供了更多自定义 URP 的方法。您也可以将本文所述的原则应用于这些事件。
beginCameraRendering 事件示例
此示例演示如何订阅 beginCameraRendering
事件的方法。
要按照此示例中的步骤进行操作,请使用__通用项目模板__创建一个新的 Unity 项目。
- 在场景中,创建一个立方体。将这个立方体命名为“Example Cube”。
- 在项目中,创建一个 C# 脚本。将这个脚本命名为
URPCallbackExample
。 将以下代码复制并粘贴到这个脚本中。
using UnityEngine; using UnityEngine.Rendering; public class URPCallbackExample : MonoBehaviour { // Unity 在启用该组件时会自动调用这一方法 private void OnEnable() { // 添加 WriteLogMessage 作为 RenderPipelineManager.beginCameraRendering 事件的委托 RenderPipelineManager.beginCameraRendering += WriteLogMessage; } // Unity 在禁用该组件时会自动调用这一方法 private void OnDisable() { // 移除作为 RenderPipelineManager.beginCameraRendering 事件的委托的 WriteLogMessage RenderPipelineManager.beginCameraRendering -= WriteLogMessage; } // 当这一方法是 RenderPipeline.beginCameraRendering 事件的委托时,Unity 每次引发 beginCameraRendering 事件时都会调用这一方法 void WriteLogMessage(ScriptableRenderContext context, Camera camera) { // 将文本写入控制台 Debug.Log($"Beginning rendering the camera: {camera.name}"); } }
注意:当您订阅某个事件时,您的处理程序方法(在此例中为
WriteLogMessage
)必须接受事件委托中定义的参数。在此示例中,事件委托是RenderPipeline.BeginCameraRendering
,它需要以下参数:<ScriptableRenderContext, Camera>
。将
URPCallbackExample
脚本附加到 Example Cube。选择 Play。每次 Unity 引发
beginCameraRendering
事件时,Unity 都会在 Console 窗口中打印来自脚本的消息。要调用
OnDisable()
方法:在运行模式下,选择 Example Cube,并清除脚本组件标题旁边的复选框。Unity 会从RenderPipelineManager.beginCameraRendering
事件中取消订阅WriteLogMessage
,并停止在 Console 窗口中打印消息。