Massive Cloudsで複数のMassiveCloudsコンポーネントを併存した状態で切り替えるためのコード修正

皆さんMassive Clouds使ってますか？
手軽にVolumeticな雲を描画するために有効なアセットです。

https://assetstore.unity.com/packages/vfx/shaders/fullscreen-camera-effects/massive-clouds-screen-space-volumetric-clouds-131898

正直モバイルでいかほどの負荷になるか、まだ動かしていないので怖い所ですが、
次のネタで使ってみようと思ったので最近よく触っています。
そんな時にとある問題が発生＆解決できたのでメモしておきます。

# 前提
本件は下記の環境で動作を行っています
* Unity2022.2.0f1
* URP 14.0.4
* Massive Clouds - Screen Space Volumetric Clouds 4.1.2

通常のMassive Cloudsの使い方通り、カメラのGameObjectにMainCameraタグをつけ、そこのMasssiveCloudsコンポーネントを張り付けて使用しています。
そしてUniversalRP上で使いたいのでMassiveCloudsUniversalRPScriptableRendererFeatureも追加。
まぁその辺りの使い方は公式マニュアルを読んで頂いて…

# 問題
今回はタイトル画面と、ゲームプレイ中の2つのMassiveCloudsコンポーネントを切り替えようとしていました。

<img width="400" alt="スクリーンショット 2022-12-13 010910.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61266/9bcab193-b4cd-c9b1-8cc8-b9328acbdb8e.png">タイトル画面の雲

<img width="400" alt="スクリーンショット 2022-12-13 010844.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61266/d954993e-3519-3b73-d178-f9f896d7b3fc.png">ゲームプレイ画面の雲

タイトル画面はロード負荷を稼ぐために丸々非アクティブにして、ゲーム中においては退避しておくことにしました。
そしてPlayingシーンをAdditionalロードしておいて、ゲーム中はPlaying側のMassiveCloudsコンポーネントを使おうとした所…
<img width="600" alt="スクリーンショット 2022-12-13 011945.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61266/137b25e5-c073-93a3-96f4-51065732e3df.png">

何故か雲が表示されない…！
色々試したところ「Title側のMainCameraを削除しない限りは雲は全く表示されない」現象に悩まされました。
コンポーネントを見てもそれらしい箇所は見当たらず…いったい何故？？
# 原因
という事で色々調査した所、原因はMassiveCloudsUniversalRPScriptableRenderPassでした。

```cs:MassiveCloudsUniversalRPScriptableRenderPass.cs
    public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
    {
        if (currentMassiveClouds == null)
        {
            var massiveClouds = renderingData.cameraData.camera.GetComponent<MassiveClouds>();
            if (massiveClouds == null)
            {
                var mainCamera = GameObject.FindWithTag("MainCamera");
                massiveClouds = mainCamera?.GetComponent<MassiveClouds>();
                if (massiveClouds == null) return;
            }

            currentMassiveClouds = massiveClouds;
        }
        if (!currentMassiveClouds.enabled) return;
        CommandBuffer cmd = CommandBufferPool.Get(RenderMassiveCloudsTag);
        currentMassiveClouds.BuildCommandBuffer(cmd, currentTarget, currentTarget);
        context.ExecuteCommandBuffer(cmd);
        CommandBufferPool.Release(cmd);
    }
```
見た通り、currentMassiveCloudsに一度代入されるとcurrentMassiveCloudsのインスタンスが残っている限り、
最初に代入したcurrentMassiveCloudsがいつまでも残り続けるようになっていました。

ので一部だけを変更。
```cs:MassiveCloudsUniversalRPScriptableRenderPass.cs変更後
    public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
    {
        if (currentMassiveClouds == null)
        {
            var massiveClouds = renderingData.cameraData.camera.GetComponent<MassiveClouds>();
            if (massiveClouds == null)
            {
                var mainCamera = GameObject.FindWithTag("MainCamera");
                massiveClouds = mainCamera?.GetComponent<MassiveClouds>();
                if (massiveClouds == null) return;
            }

            currentMassiveClouds = massiveClouds;
        }

        if (!currentMassiveClouds.enabled)
        {
            currentMassiveClouds = null;    //←☆ポイントはココ。Disable時にnull代入して、描画時に再度インスタンスを確保しなおすように修正
            return;
        }

        CommandBuffer cmd = CommandBufferPool.Get(RenderMassiveCloudsTag);
        currentMassiveClouds.BuildCommandBuffer(cmd, currentTarget, currentTarget);
        context.ExecuteCommandBuffer(cmd);
        CommandBufferPool.Release(cmd);
    }
```

こうする事で、disableになった場合に新たにカメラに付随したMassiveCloudsコンポーネントを確保することが出来るようになりました。
コンポーネント側のパラメータ設定が良くないのかなぁ？？と思い色々試したのですが、RendererFeature(Pass)側に原因があったとは、盲点でした。

![AGDRec.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61266/5e065898-c610-dc2a-9934-c1c55bc6060d.gif)
という事で、雲の切り替え完了です

# おわりに
という事で、かなりニッチな記事になってしまいましたが、MassiveCloudsコンポーネントをコネコネするのに時間を食ってしまったので、解決手法のログとして＆ちゃんとRendererFeature側も確認するべしという反省として記事化しておきます。

あと、新バージョンのMassive Clouds Atmos も出ているらしいですね。

https://assetstore.unity.com/packages/tools/particles-effects/massive-clouds-atmos-volumetric-skybox-173160

※何故か無料で取得出来た。セール中？それとも旧バージョン持ってるからかな？
※All Massive Clouds User can upgrade for a difference.　との事で、旧バージョンを持ってるからっぽい

Atmosではこの辺りどうなっているんだろう？
またその内調査してみようと思います。