【Unity】ビルトインRPからURPに移行するための基礎知識・手順まとめ

Unity ビルトインRPからURPに移行しよう ゲーム開発

今回はUnityでのゲーム開発に関する話題で、タイトルのとおり

ビルトインRPからURPに乗り換えるための基礎知識・具体的な手順

を分かりやすく丁寧に解説する内容になっております。

まず、執筆時点ではUnityには大きく分けて3つのレンダーパイプラインがあります。

  • ビルトインレンダーパイプライン(※長いので以下「ビルトインRP」と表記)
  • URP
  • HDRP

レンダーパイプラインとは簡単に言うとゲームのグラフィックの描画システムのようなものです。Unityでは2018年ごろから長年デフォルトで上記3つのレンダーパイプラインが用意されており、必要なグラフィックの質やパフォーマンスに応じて使い分けるようになっていました。ただし問題点としてそれぞれのレンダーパイプラインにはなんと互換性が無いことから、途中でパイプラインを変更するのが難しかったり、Unity初心者の方にとっては無用な混乱の元になったりしていました。

さてそのような中でUnity6.5以降、長きにわたって多くのゲーム開発者に使われてきた旧式の「ビルトインレンダーパイプライン」が非推奨になりました。以前から「いずれ廃止されるのでは…」と噂されてきたのですが将来的な廃止が明確に決まった形です。

これによりUnity側はURPへの移行を推奨しています。しかし今までビルトインRPを愛用してきた開発者の方からしたら

  • URPってビルトインとは使い方が違うんでしょ?一体どうやって使えばいいの??
  • 既存のプロジェクトをURPに移行する方法はあるの?

と困ってしまうのではないでしょうか。

そこでここでは、URPの登場当初から長年URPを使ってきた私がURPの使い方や移行方法を解説していきますね。

前提知識:URPとは?

まず前提知識としてURPについてザックリとご説明します。

URPは汎用性が高いレンダーパイプライン

URP(Universal Render Pipeline)はビルトインRPの後継となるレンダーパイプラインで、ザックリいうと柔軟で汎用性が高く・しかも処理が軽量です。HDRPと比較するとリアルさには欠けますがPCやゲーム機だけでなくスマホゲームやVRゲームにも適しており、幅広いプロジェクトで活用することができます。

URPに適したプロジェクトの例:

  • リアルなライティングが必要ないアニメ調のグラフィックのゲーム
  • スマホやVR機器向けのゲーム

URPの概要については(古い記事ですが)下記でかなり詳しくご説明していますので、そちらも併せてご覧いただくと理解が深まると思います。

URPとビルトインRPの主な違い

URPとビルトインRPの主な違いをまとめると次の表のとおりとなります。

比較項目ビルトインRPUniversal Render Pipeline (URP)
基本構造C++エンジン内部のブラックボックスC#(SRP API)で制御可能なオープンな設計
ドローコール最適化静的/動的バッチ処理SRP Batcher による大幅なCPU負荷削減
ライティング方式Forward / DeferredForward+(多数の光源を低負荷で処理可能)など
シェーダー開発Surface Shader / HLSLShader Graph / URP用HLSL
ポストプロセスPost Processing Stack v2(別パッケージ)Volumeシステム(標準統合)
レンダリング拡張Command Buffer(記述が複雑)Scriptable Renderer Features(視覚的&柔軟)

上記は専門用語ばかりでちょっと難しいので分かりやすく解説します。

URPの基本構造

まず、ビルトインRPでは描画処理の大部分がUnityエンジンのC++コア側にハードコードされており、ブラックボックス状態だったのでレンダリングパイプライン自体の挙動を書き換えることがほぼ不可能でした。

一方でURPではC#で書かれたScriptable Render Pipeline(=SRP)というレンダーパイプラインを基盤としています。これによって開発者がC#コードを通じてレンダリング手順を自由に制御・拡張できるようになったのが特徴です。

ドローコール最適化

次に、URPには「SRP Batcher」と呼ばれる描画処理の最適化機能が標準搭載されています。

ビルトインRPでは多数のメッシュを描画すると描画処理がどんどん重くなる傾向にありましたが、URPでは比較的多くのメッシュを描画しても負荷の上昇率を抑えることが可能です(もちろん大量のメッシュ描画で重くなるのは変わりませんが…)。

ライティング方式

ライティング方式の違いについては、ビルトインRP標準のForwardレンダリングではオブジェクトに当たるライトの数だけ描画命令が増加してパフォーマンスが急激に低下していました。

一方で最近のURPでは「Forward+」レンダリング が標準サポートされています。このライティング方式では画面をタイル状に分割して光源をカリングするため多数の動的ライトを低負荷で配置できます。

シェーダー開発

URPには「Shader Graph」という便利なシェーダーエディタ機能が標準搭載されており、誰でも簡単にシェーダーを作ることができます(※なお、最近のUnityでは一応ビルトインRPでもShader Graphを使用可能)。

Shader Graphの使い方については下記の記事で詳しくご説明していますのでそちらも併せてご覧いただければと思います。

ポストプロセス

ビルトインRPではPost Processing Stackというパッケージを別途導入する必要がありましたが、URPでは「Volume」というポストプロセス機能が最初から組み込まれています。

レンダリング拡張

ゲームに特定の描画効果(アウトライン表示・特定のレイヤーのみ別パスで描画するなど)を挟みたい場合、ビルトインRPでは複雑なCommand Bufferを書く必要がありました。一方でURPではScriptable Renderer Featureを使用することで、レンダーパイプラインアセットに機能を差し込むだけで簡単にカスタム描画を追加できます。

URPの使い方

さてビルトインRPとURPの違いを知っていただいたところで次はURPの使い方を解説します。同じUnityなので基本はだいだい同じような感覚で使えますが、次の3つは大きく違うのでそこだけ覚えていただければ大丈夫です。

  • ビルトインRP用のマテリアルはURP用に変換する必要がある
  • グラフィックの設定を行う際は「Universal Render Pipeline Asset」で設定する
  • ポストプロセスは「Volume」コンポーネントを使う

ビルトインRPのマテリアルをURP用に変換する方法

まず一番重要な点として知っておきたいことはURPでは使えるシェーダーがビルトインRPとは違うということです。例えばビルトインRPの標準シェーダーは「Standardシェーダー」でしたがURPでこれに相当するのは「Litシェーダー」です。

そしてURPとビルトインRPのシェーダーには基本的に互換性が無いので、URPでは従来からのStandardシェーダーは使えずStandardシェーダーのマテリアルをURPに導入するとピンク色(=シェーダーエラー)になってしまいます。

これを修正するために、最近のUnityには「レンダーパイプラインコンバーター」というマテリアルの変換機能が用意されています。この機能の使い方に関しては過去の記事で詳しく解説していますのでそちらも併せてご覧いただければと思います。

ただしこの方法はStandardシェーダー→Litシェーダーに変換することしかできません。したがって、例えば独自のシェーダーを使った3Dアセットの場合は変換できずそのままになってしまいます。その場合は非常に面倒ですが手作業で修正するしかありません…。

※下手にマテリアルのシェーダーを変更するとテクスチャ等の参照関係がぶっ飛ぶことがあり、その参照関係を手作業で修復しないといけないのでプロジェクト内のマテリアル数によってはシャレにならないほどめんどくさい作業になります。注意しましょう。

グラフィックの設定を行う際は「Universal Render Pipeline Asset」で設定する

次に、URPではグラフィック設定を行う場所も違います。URPでグラフィック設定を行いたい場合は「Universal Render Pipeline Asset」という設定用のファイルがあるのでそれを変更しましょう。

…といっても設定項目は専門用語だらけで意味が分からない方も多いかと思いますので、主な項目を抜粋して簡単に解説しておきます。

  • 深度テクスチャ:
    画面の深度情報(カメラから画面内のオブジェクトまでの距離)を記録したテクスチャを生成します。一部のポストエフェクトや、水面表現など奥行きを必要とするシェーダーで必要ですが、それらを使う予定がなければOFFにしておくとよいです。
  • 不透明テクスチャ:
    描画途中の不透明オブジェクトの画面キャプチャを保持します。ガラスの屈折などの表現で使用します。こちらも使わなければOFFに。
  • GPU常駐ドロワー:
    Unity6.0あたりで登場した新機能。有効にするとドローコール(描画命令)の回数が減って描画処理が速くなります。ただし、有効化するにはいくつか前提条件があります。
  • アンチエイリアス(MSAA):
    3Dオブジェクトの輪郭を滑らかにするアンチエイリアス機能です。
  • レンダースケール:
    描画解像度のスケール比率。1.0未満に設定すると解像度が下がる代わりに描画負荷を削減できます。
  • アップスケールフィルター:
    レンダースケールを1.0以外にした際の拡大フィルターを指定します。
  • LODクロスフェード:
    LODを滑らかに遷移させるための機能。普通LODを使うとメッシュがいきなり切り替わって不自然になってしまいますが、これを有効化し・かつLODクロスフェードに対応しているシェーダーを使うことでメッシュの切り替わりが滑らかになります。
  • メインライト:
    メインライト(主にディレクショナルライト)の有効無効や、そのライトが落とす影の有効無効・解像度を指定します。
  • 追加ライト:
    メインライト以外の光源の有効無効やそれらの影の設定を行います。

これらの設定は描画負荷にかなり影響するので、ゲームの描画処理が重いようなら設定を見直してみるといいかもしれません。

ポストプロセスは「Volume」コンポーネントを使う

さて三つ目の違いはURPではポストプロセスは「Volume」コンポーネントを使うという点です。

Volumeの使い方は、まず「Volume Profile」という設定ファイルを作り、それを適当なゲームオブジェクトにアタッチしたVolumeコンポーネントに登録するだけです。使い勝手自体はビルトインRPのPost Processing Stackとあまり変わりませんが、機能が少し違うなど微妙な違いがあります。

Volumeコンポーネントの例

Volumeの使い方については下記の記事で詳しく解説していますので、そちらも併せてご覧いただければと思います。

プロジェクトをビルトインRPからURPに移行させる方法

では最後にプロジェクトをビルトインRPからURPに移行させる方法を解説します。

身も蓋もない話:新しいURPプロジェクトを作るのが一番楽

まず身も蓋もない話をすると、既存のビルトインRPプロジェクトをURPに移行させるのはハイリスクです。なぜなら

  1. ビルトインRP用のシェーダーはURPでは使えない
  2. そこでシェーダーをURP用に切り替える必要があるが、下手にマテリアルのシェーダーを切り替えるとマテリアルの設定がぶっ飛ぶ可能性がある
  3. 設定が飛んで壊れたマテリアルは手動で修復するしかない
  4. Unityではプロジェクト内のマテリアルの数が多くなりがちなので、多くのマテリアルが壊れた場合は収拾がつかなくなる

といった感じで修復作業が地獄になる可能性があるためです。

このような次第で、小規模プロジェクトならまだマシだと思いますが中規模以上のプロジェクトで無理にURPに移行するのはやめておいたほうが賢明かもしれません。「どうしてもURPじゃないとダメ」という場合以外は移行は見送って次のプロジェクトからURPを使い始めるのがベストだと思います。

既存プロジェクトをURPに移行させる方法

どうしても既存プロジェクトをURPに移行したい場合は下記の手順で移行することができます。

  1. URPパッケージをインストールする
  2. URPアセットを作成してプロジェクトに適用する
  3. マテリアルをURP用に変換する

必ずバックアップを取ってから作業しましょう

手順1:URPパッケージをインストールする

まずパッケージマネージャからURPをプロジェクトにインストールします。これ自体は簡単なので特に解説はいらないと思います。

手順2:URPアセットを作成してプロジェクトに適用する

次にURPに必要なアセット一式を作ってプロジェクトに適用します。

プロジェクトウィンドウで右クリックし、作成→「レンダリング」→「URP Asset(ユニバーサルレンダラーを含む)」を選択しましょう。すると上のほうでご紹介したUniversal Render Pipeline Assetが生成されます。

そうしたらこれをProjectウィンドウのグラフィック設定にある「Default Render Pipeline」欄に登録しましょう。ゲーム画面がピンク色になればURPへの移行自体は完了です。

手順3:マテリアルをURP用に変換する(※場合によってはこれが大変)

最後にマテリアルをURP用に変換します。Standard Shaderを使っていたマテリアルは↑のほうで紹介したレンダーパイプラインコンバーターを使って安全にURP用に変換できます。

しかし問題はビルトイン専用の独自シェーダーを使っていたマテリアルがある場合で、この場合はURPに対応したシェーダーに手動で切り替えるしかありません。当然ながらこの手のマテリアルの数が多いほど切り替え作業が大変になりますので覚悟して取り組みましょう。

おわりに

以上、UnityでビルトインRPからURPへ移行するための基礎知識や具体的な手順についてご説明しました。

長年ビルトインRPを使ってきた方にとって廃止の流れは少々悲しいかもしません。しかし個人的にはURPのほうが便利だと思うので、ビルトインRPユーザーの方はこの機会に次のプロジェクトではURPに乗り換えてみることをお勧めします。新しいレンダーパイプラインでUnityでの開発ライフを楽しみましょう。

この記事がUnityでのゲーム開発のお役に立てば幸いです。