現在のところ(Unity 5.6.2p2で確認)、このアセットはUnity 5.6で正常に動作しません。Unity 5.5以前やUnity 2017以降であれば動作します。
このチュートリアルでは、どのように Dynamic Shadow Projector オブジェクトをシーンに追加するかを説明します。
最終的な結果は次の動画のようになります:
- 新規のシーンから始める
ここでは説明のために新規のシーンから始めます。シーンにはメインカメラと平行光源がひとつだけあります。プロジェクトの中にはDynamicShadowProjector と Standard Assets (Camera パッケージと Character パッケージ) があります。.
- 平面オブジェクトとキャラクターオブジェクトを追加する
皆さんの既存のシーンには地形オブジェクトとキャラクターオブジェクトがあることと思いますが、ここでは平面オブジェクトを地形として、Standard Assets の ThirdPersonController をキャラクターオブジェクトとして使うことにします。
- シャドウマップを無効にする
この段階で影が見えるならば、それはシャドウマップです。平行光源のオブジェクトを選択して Shadow Type を “No Shadows” にしてください。もしグローバルイルミネーションを使おうと考えているならば、Quality Settings でシャドウマップを無効にした方が良いかもしれません。
- プロジェクターオブジェクトを作成する
平行光源と同じトランスフォームを持つように、Empty Game Object を平行光源オブジェクトの子供として作成してください。そして名前を “Shadow Projector” とします。
- Draw Target Object コンポーネントを追加する
Inspector ビューにある Add Component ボタンを押して、”Scripts” > “DynamicShadowProjector” > “Draw Target Object” を選択します。
- キャラクターオブジェクトをターゲットに指定する
この段階で先程追加した Shadow Projector オブジェクトは、Projector コンポーネント、Shadow Texture Renderer コンポーネント、Draw Target Object コンポーネントを持っているはずです。ThirdPersonController オブジェクト(キャラクターオブジェクト)をドラッグして、Draw Target Object コンポーネントの Target フィールドにドロップしてください。
- プロジェクター用にマテリアルを新規に作成する
次に、プロジェクター用のマテリアルを作成します。Assetsフォルダを右クリックして、”Create” > “Material” と選択してください。作成されたマテリアルには “Shadow Projector” と名前を付けておきます。このマテリアルにはプロジェクタ用のシェーダーなら何を指定してもかまいません。例えば、Standard Assets の Effects パッケージに含まれている “Projector/Multiply” を使うこともできます。このチュートリアルでは、Percentage Closer Filter 風のソフトシャドウをデモするために “DynamicShadowProjector/Projector/Dynamic/MipmappedShadow” シェーダーを使うことにします。
- 今作ったマテリアルをプロジェクターコンポーネントにセットする
Shadow Projector オブジェクトを Hierarchy ビューで選択して、今作ったマテリアルをドラッグしてプロジェクターコンポーネントにドロップします。
- プロジェクターの位置とサイズを調整する
もう影を描画する準備は整いました。下の画像にあるように、プロジェクターコンポーネントのパラメーターをセットして、プロジェクターオブジェクトの位置を Scene ビュー で調整してください。正しいプロジェクターの位置はキャラクターオブジェクトをどこに置いたかで変わってくるので、下の画像とは異なる場合があります。描画された影のイメージがテクスチャの中心に来ることを確認してください。
- テクスチャの設定を変更する
Mipmapped Shadow シェーダーの機能を有効にするために、テクスチャーの設定を下の画像のように変更します。Scene ビュー上にある Shadow Texture ウィンドウにいくつかの影のイメージが描画されると思います。一番左の画像がミップレベル 0 のもので、一番右の画像がミップレベルが最大のものになります。
*Version 1.0 ではメモリリークのバグがあり、ミップレベルが0よりも大きい場合に、一時的なレンダーテクスチャが毎フレーム解放されずにいました。すぐに Version 1.0.1 が公開される予定ですので、忘れずにアップデートしてください。
- クリップ面の調整
これでぼやけた影のイメージをミップマップに含むテクスチャが出来ましたが、キャラクターの影は未だにハードエッジの影になっています。これは影の描画にミップレベル 0 のものしか使われていないためです。Mipmapped Shadow シェーダーによって選択されるミップレベルは影が描画される位置とプロジェクターのニアクリップ面との距離で決まります。つまり、ニアクリップ面に近いところの影にはミップレベル 0 が使われ、ファークリップ面に近いところの影には最大ミップレベルのものが使われます。そのため、ニアクリップ面とファークリップ面を調整しないと、きれいなソフトシャドウを作ることができません。
- キャラクターオブジェクト用のレイヤーを追加する
キャラクターを後ろから見ると、キャラクター自身の影が足にかかってしまっているのに気付くと思います。このような影を取り除くために、キャラクター用のレイヤーを追加する必要があります。Unityのウィンドウの右上にある “Layers” ドロップダウンをクリックして、”Edit Layers…” を選択します。すると “Tags & Layers” の設定が Inspector ビューに表示されるので、空いている場所に キャラクター用のレイヤーの名前を入力します。
- 今追加したレイヤーをキャラクターオブジェクトに割り当てる
キャラクターオブジェクトを選択して、Inspector ビューで今追加したレイヤーを割り当てます。
- キャラクター用のレイヤーをプロジェクターの Ignore Layers フィールドに追加する
Shadow Projector オブジェクトに戻って、Projector コンポーネントの “Ignore Layers” フィールドにキャラクター用のレイヤーを追加します。これでキャラクター自身に落ちていた影が消えるようになります。
- フォールバックコンポーネントを追加する
これで影は完璧になりましたが、もうひとつ手順が残っています。Mipmapped Shadow シェーダーは tex2Dlod 関数を使っていて、シェーダーモデル 3.0 以降(DirectX)、もしくは OpenGL ES 3.0 以降、もしくは OpenGL ES 2.0 に texture lod の拡張を必要とします。そのため、いくつかの古いデバイスでは動作しない可能性があります。そこで、モバイルプラットフォームを対象としている場合には特に、フォールバックを準備しておくことをお勧めします。Inspector ビューにある “Add Fallback Component” ボタンを押してください。すると、Mipmapped Shadow Fallback コンポーネントが追加されます。”Test Fallback” にチェックを入れることで、フォールバックの見た目を Scene ビューで確認しながらパラメーターを調整することができます。
- カメラリグを追加してシーンを再生する
いよいよシーンを再生します。影がどのように見えるか確認しやすくするために、カメラリグを追加しましょう。Standard Assets にあるMultipurposeCameraRig をシーンにドラッグ&ドロップして、キャラクターオブジェクトをカメラリグの Target に設定します。そして、今まであった Main Camera は削除してください。
これでシーンを再生できます。矢印キーまたは A D W S キーでキャラクターを移動させたり、スペースキーでキャラクターにジャンプさせたりすることができます。