URP対応


投稿日:2024年4月20日 | 最終更新日:2024年10月16日

Unityの描画システムのまとめ

Unityは、根本的な描画システム(RenderPipeLine)が複数種類あります。
参考:レンダーパイプライン - Unity マニュアル

当初からあった「BRP(Built-In RenderPipeLine)」が長らく標準機能だったのですが、
Unity6からは「URP」という、高性能な描画システムが新規プロジェクト作成時のデフォルトテンプレートになりました。
もうひとつ、「HDRP」というのもあり、これはフォトリアルなハイクオリティな描画を行うためのものです。
将来的には(Unity7から?)これらを統合した「Unified Rendering(仮称)」となる予定のようです。

URPを使う場合の注意点

全てのアセットの対応が必要

プロジェクト内で使用する全てのアセットがURPに対応している必要があります。
これは、アセットストアのアセットであっても同様で、アセットごとに対応ずみである必要があります。
「宴」以外のアセットストアのアセットや、Live2dなどのサードパーティのプラグインを使用する場合は、それらがURPに対応しているか注意してください。

Unity6対応

Unity6ではURPの内部の基本システムがさらに仕様変更され、RenderGraphという新しいシステムを使用する形になっています。
宴では4.1.3からこの機能にも対応していますが、利用予定のアセットがこれに対応しているかも注意してください。

宴のURP対応

宴では、Version4.1.3からURPにも対応していて、Unity2021,Unity2022,Unity6で動作します。

新規プロジェクトの場合

Unityの新規プロジェクトをURPで作成し、宴の新規プロジェクトを作成した場合は、自動的にURP用の設定がされます。
特に何もしなくてよいです。

宴4.1.2以前のURP拡張パッケージを使っていたプロジェクトから宴4.1.3にバージョンアップする場合

Utage4.1.3以降は、旧来のUrp拡張パッケージのScriptやシェーダーは本体に吸収されています。
「UtageForUrp/Data」フォルダのみ残して、それ以外を削除してから、宴4.1.3にバージョンアップしてください。

BRP(Built-In RenderPipeLine)を使っていたプロジェクトからURPに以降する場合

Unity6でも従来のBRPは使用可能ですので、必要がなければ移行する必要はありません。
上記にあるように、宴だけではなくプロジェクト内で使用する全てのアセットがURPやUnity6に対応している必要がありますので、互換性に注意してください。

URPに移行したい場合は、手順は以下の通りになります。

  1. PackageManagerからURPパッケージをインポートと、URPの初期設定
    Unity公式のドキュメントにある通りURPのセットアップをしてください。

  2. UtageのシーンをURP用にコンバート
    2-1. トップメニュー「Tools>Utage> Urp Scene Converter」を開く。
    2-2. 「Target Scene」にURPにコンバートしたい「宴」のシーン(宴のカメラとAdvEngineがあるシーン)を設定
    2-3. ノベルゲームの場合は「NovelGameType」をオンに。会話シーンなどで使っている場合はオフに設定。
    2-4. Convertボタンを押すと、設定したシーンに対してURP用のカメラ設定やイメージエフェクトの設定がされます。

宴のURP対応の仕組みと互換性

基本的には宴はUGUIベースで描画しているため、殆どの部分で違いはありません。
カメラとカメラに対するポストエフェクト処理の部分だけはURP対応が必要という形になっています。
一部の機能はデフォルト(Built-in Render Pipeline)版と完全な互換性がないので、注意してください。
以下、URP対応した機能についての詳細です。
もし、描画エラーが出るようでしたらURP対応の不具合が発生しているということになりますので、Q&Aなどにご連絡ください。

FadeIn、FadeOutコマンド

画面の暗転させたりするFadeIn、FadeOutコマンドはポストエフェクトとして処理しています。
URP版ではArg6でキーフレームアニメを使用することはできません。

ImageEffectコマンド

ImageEffectコマンドはURP版では少し機能が異なります。
MotionBlurとBloomはURP版では対応していませんので、使用しないでください。(Unity標準のポストエフェクト機能に同等のものがあるので、近いうちにそちらで対応しようと思います)

また、URP版ではArg3でキーフレームアニメを使用することはできません。が、代わりにArg6で指定した時間をかけてエフェクトがスムーズに変化するようになります。
ただし、Negaposi(ネガポジ反転)は、中間色はすべて灰色になってしまうためArg6に対応していません。(即座に変化します)

CaptureImageコマンド

CaptureImageコマンドで使用するゲーム画面のキャプチャ機能も、ポストエフェクトと同じ仕組みで作成しています。
互換性に特に違いはありません。

キーフレームアニメーションが未対応な点について

URP版では、FadeIn、FadeOutコマンドやImageEffectコマンドのArg6に、時間の代わりに指定可能だったキーフレームアニメーションが使用できなくなっています。
URPのポストエフェクトは基本的にはキーフレームアニメーションで操作せず、Weightというエフェクトの度合いの係数で操作する設計だと思われるため、キーフレームで細かな値を設定する形はとっていません。
エフェクトそのものの細かい値の調整が必要な場合は、各エフェクトのボリュームの設定を調整してください。
(基本的にはUnityのポストエフェクトの仕組みと同じはずです)

URPのVolumeコンポーネントのインスペクター上では手動で細かな値を操作できるのですが、これはそう見せているだけで、実際はコンポーネントではなくScriptableObjectの値を操作しています。
ScriptableObjectにはキーフレームアニメーションをさせることはできません。
(コンポーネントではなくScriptableObjectを採用した点はUnityの設計ミスな気がします)
なので、キーフレームアニメーションを使用するには、「値が変更されるとVolumeコンポーネントに設定されている対応ボリュームの値を操作する新しいコンポーネント」を作って、さらにそれにキーフレームアニメーションをかける必要があります。
一応、その形であれば対応はできるのですが、Unity側がこの問題に対応する気があるのかないのかがよくわからないので、今のところ未実装です。
そのようなコンポーネントを自作して設定すれば一応キーフレームアニメーションも利用できるようになります。

URPでのカメラ設定の注意点

複数カメラを使った場合に、前のカメラに重ねて次のカメラの描画をすることに制約がある

URPでは複数カメラを使う場合に、従来よりも複雑な制限があります。

各カメラの背景(バックバッファ)の扱い

URPでは、各カメラの背景(バックバッファ)をどう処理するかは、BackGroundTypeから設定可能です。

Skyboxの場合は、設定したSkyboxが背景に描画されます。
SolidColorの場合は、設定した色で背景が塗りつぶされます。
ここまでは従来のBRPと同じなのですが、「DontClear(なにもせず前のカメラで描いたものを背景として重ねて描画する)」がなくなり、代わりに「Uninitialzed」が追加されています。
ただ、これはDontClearと違い「初期化をしない」であって、その場合背景に何が描かれるかはアプリが動作するデバイスによって挙動が違うものになります。
直前のカメラの描画をそのまま背景として描画している場合もあれば、なんらかの色や未定義なバグった背景になっている場合もあるようです。
この設定をしているカメラで必ず画面を全て塗りつぶすことがわかっている場合は問題なく使えると思うのですが、
DontClearのように前のカメラに描画したものに重ねて描画したい場合にはこれを使ってはいけないようです。

参考:
https://discussions.unity.com/t/uninitialized-background-type-not-working-on-android/847500
https://discussions.unity.com/t/urp-cameras-do-not-respect-the-uninitialized-option/896406

ノベルゲームの場合

宴をノベルゲームとして構成する場合は、基本的にはCamera Stackingという機能を使っています。
ノベルゲームの場合は特に手動でカメラ構成を変更する必要はありません。

会話シーンで使用している場合

「Camera Stacking」は異なる描画領域を持つカメラでは使えないため、宴のLeterboxカメラ機能をflexibleにして全画面を描画領域にするしてあります。

ゲーム画面を描画するカメラ(おそらくはMainCamera)に対して、手動で宴のカメラを「Camera Stacking」として設定してください。
デフォルトではUninitialzedを使ってカメラを重ねていますが、これは上記のようにデバイス依存で動作が変わるため、必ず手動でカメラ設定の変更が必要になります。

CameraStakingを使わなくても、カメラの描画対象をRenderTextureにする機能を使えば、より柔軟に描画できるようになります。
(たとえばゲーム画面をRenderTextureに描画して、それを背景として使うなど)

ただ、結局のところURPの複雑なカメラ構成をどう設定するかはプロジェクトによるので、基本的にはプロジェクトの目的に合わせて最適なものを選択してください。
URPは、もともとはRenderPipelineをカスタムする目的で作成されたものです。
RenderPipeline(描画パイプライン)は文字通り描画の流れのことで、カメラの設定はまさにその描画の流れに直接関わっています。
つまり、それをプロジェクトごとに細かく設定するのが前提の設計になっているようです。
もし「宴」側で足りない機能などがあれば、Q&Aに要望をいただければと思います。

Rendererを変更して宴のポストエフェクト機能(RenderFeature)を追加する

宴の新規プロジェクトを作成した場合や、シーンのコンバート機能を使った場合、現在設定されているDefaultのRendererに宴のRenderFeatureが自動追加されます。

Rendererを変更して、そのRendererを宴のカメラに使いたい場合は、そのRendererを選択→右クリック→「Utage>AddRenderFeatures」としてください。

選択したRendererに「宴」で使用するRenderFeatureが追加されます。

HDRP対応

HDRPは現在未対応です。要望があるようでしたら作成を検討します。
ただ、Unity7(仮)では全て統合される予定らしいので、基本的にはそれを待つつもりです。

またHDRPであっても宴の機能の9割はそのまま使用可能です。
未対応なのは上記のFadeIn、FadeOutコマンドImageEffectコマンドCaptureImageコマンドのみとなります。
カスタムコマンドなどを使って使用したい機能のみ実装して代替することも可能です。
(たとえばフェードコマンドのみ使用したい場合、UI等を追加して宴の手前に黒いImageを表示する機能を作成してそれを呼び出すなどです)