Unity では、各フレームで各アクティブカメラがレンダリングされる前に beginCameraRendering イベントが発生します。カメラがアクティブでない場合 (例えば、カメラゲームオブジェクトで Camera コンポーネントのチェックボックスがオフになっている場合)、このカメラの beginCameraRendering イベントは発生しません。
このイベントにメソッドをサブスクライブすると、Unity でカメラのレンダリングが行われる前にカスタムロジックを実行できます。カスタムロジックの例としては、レンダーテクスチャに追加のカメラをレンダリングし、そのテクスチャを平面反射や監視カメラビューのような効果に使用する方法があります。
RenderPipelineManager クラスの他のイベントを使用すれば、さまざまな方法で URP をカスタマイズできます。それらのイベントにも、この記事に記載されている原則を適用できます。
RenderPipelineManager クラスのイベントの 1 つにメソッドをサブスクライブします。
サブスクライブされたメソッドで、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 calls this method automatically when it enables this component private void OnEnable() { // Add WriteLogMessage as a delegate of the RenderPipelineManager.beginCameraRendering event 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 にアタッチします。
Play を選択します。Unity で beginCameraRendering イベントが発生するたびにスクリプトのメッセージが Console ウィンドウに出力されます。
OnDisable() メソッドを呼び出すには、再生モードで Example Cube を選択し、スクリプトコンポーネントのタイトルの横にあるチェックボックスをオフにします。RenderPipelineManager.beginCameraRendering イベントから WriteLogMessage のサブスクライブが解除され、Console ウィンドウへのメッセージの出力が停止されます。
スクリプタブルレンダーパスは、シーンに存在する任意のゲームオブジェクトを介してシーンに挿入できます。これにより、レンダーパスがいつアクティブになるかをより正確に制御できます。しかし、これは使用したいすべてのポイントでゲームオブジェクトがレンダーパスを挿入しなければならないことを意味します。そのため、プロジェクト内の一般的な効果は、代わりにスクリプタブルレンダラー機能を介して挿入することをお勧めします。
スクリプタブルレンダーパスをゲームオブジェクトを介してシーンに挿入する場合は、URP がこのスクリプトをどのように使用するかを考慮することが重要です。最初にスクリプタブルレンダーパスをレンダリングするカメラは、レンダーパスを使い切り、レンダーパスが適用される唯一のカメラになります。スクリプタブルレンダーパスが適用されうるカメラで、最初のカメラの後にレンダリングするものは、効果をレンダリングしません。
例えば、2 台のカメラがあり、Update メソッドにスクリプタブルレンダーパスを追加した場合、最初にレンダリングするカメラだけがスクリプタブルレンダーパスの効果を使用します。これは、最初のカメラが効果のインスタンスを使い切るためです。2 番目のカメラは Update メソッドの次の呼び出しの前にレンダリングするため、スクリプタブルレンダーパスの 2 番目のインスタンスは使用できません。その結果、2 番目のカメラは、スクリプタブルレンダーパスの効果をその出力に適用しません。