ゲームにおいて「影」はオブジェクトの位置や存在感をプレイヤーに伝える重要な要素です。
しかし、リアルタイムで影を描画すると処理負荷が高くなってしまいます。
従来の Unity では Projector コンポーネントを使って簡易的な影(いわゆる「Blob Shadow」)を表現していましたが、Unity 6 以降ではこの仕組みが廃止され、代わりに Decal Projector を利用するのが標準となりました。
今回は、この新しい Decal を用いた影の作成方法と表示手順について解説します。
環境
Unity6000.0.57f1
Universal3D テンプレート
作成
- Unity6環境においてUniversal3Dテンプレートよりプロジェクトを作成する(DecalTest)
- 新規にCubeを作成し以下のように調整する
- 名前をFloor
- Scaleを(25,1,25)
- MeshRendererのMaterialをWhite(影を見やすくする)

- 新規にSphereを作成し、以下のように調整

- Directional LightをNo shadowにする

Decalのインポート
- Package ManagerからUniversal Render Pipeline > Samples > URP Pcakage Samplesをインポート

Rendererの設定
デフォルトのままだとDecalによる影が描画できない。まずはこれを描画できるようにする
- Settings > PC_Renderer > Add Renderer Feature

- 選択肢が開くのでDecalを選択

- Decalを描画できるようになった!

- モバイル環境を想定している人はMobile_Rendererにも同様の処理をしておく
参考
このRendererファイルは
Project Settings > Quality
で読み込まれるようになっている

Decalの作成
- Sphereの子要素にCreate EmptyをしてBlobShadowにリネーム
- TransformのRotationXに90をいれる
- AddComponent > URP Decal Projector
- Projection Depth(どのくらいの範囲で影を描画するか)を5
- MaterialをBlobShadow_Mat

- ここまで設定してSphereの下に影が表示されれば成功だ

Sphereをジャンプさせてみる
- SphereにRigidbodyを付与
- ShhereController.csを以下のように作成し、Sphereにアタッチ
using UnityEngine;
public class SphereController : MonoBehaviour
{
Rigidbody rb;
public float jumpPower=300f;
void Awake()
{
rb = GetComponent<Rigidbody>();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
rb.AddForce(Vector3.up * jumpPower);
}
}
}
完成
実行しスペースを押してみよう。以下のようにいい感じに影が描画されれば成功だ。
コメント