2017年7月19日

Unity スプライトに影をつける ~その1~


スプライトのマテリアルを変更して手っ取り早く影をつける方法をメモメモ…


※このページの内容の動作確認にはUnity5.6を使用しています。
Sprite Rendererを使用してスプライトを配置した場合、デフォルトの状態のままではライトの影響をうけないため、他のオブジェクトに影を落としたり他のオブジェクトの影に入って暗くなったりすることはありません。たとえば下の画像ではスプライトの花や草に影が全くついていません。


影をつける方法はいろいろあると思いますが、とりあえず今回はマテリアルを変更することで対応してみたいと思います。デフォルトのSprites-Defaultというマテリアルから、ライティングに対応したものに変えればいいわけです。

マテリアルの作成・変更

というわけでまずは Create > Material でマテリアルを作成します。シェーダーはそのままStandardにしておきましょう。う~ん贅沢!ここで重要なのは、必ずRendering Modeを"Cutout"にしておくということです。Cutoutというのは「透明度が一定の値を超えたら描画しない!それ以外は描画する!」というモードなので、スプライトの透明な部分をきちんと透明にしておくためにはこのモードを指定する必要があります。

Rendering Mode を Cutout に変更

あとはSprite Rendererのついたオブジェクトにこのマテリアルを適用すれば完了です。お疲れさまでした。


…いや、影ついてねえよ!

Cast Shadows / Receive Shadows の切り替え

実はマテリアルを変更しただけではダメで、Sprite Rendererの設定項目からCast Shadows(他のオブジェクトに影を落とす)とReceive Shadows(他のオブジェクトから影をうける)をそれぞれ有効化する必要があります。

ただ、この2つの項目はSprite Rendererのインスペクタ上では通常「隠されて」います。表示するには、インスペクタ右上にある三本線(▼三)をクリックしてDebugを選択し、デバッグモードにしないといけません。普通はあまり使わない機能なので隠してるんでしょうか…

デバッグモードにすると項目が表示される
あるいはスクリプトから変更することもできます。

SpriteRenderer sr = GetComponent<SpriteRenderer>();
sr.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.On;
sr.receiveShadows = true;

こんな感じ。

これで今度こそ影がついたはずです。


木陰にある花はちゃんと暗くなり、花や草の影がバッチリのびていますね。いぇい!


Standardシェーダーがとにかく万能なので、ライトの色の変化とも連動してええ感じの色合いにしてくれます。ただし、基本的にリアルタイムで影をつけるというのはとても重い処理なので、うまくライトマップに焼いて対処するとか、もう少し軽い処理を考えるとか、ここぞというとき以外は影はつけない(Sprite Rendererでの色調整だけですます)とか、状況によってうまく使い分けたほうがよさそうです。

あと注意点としては、シェーダーを変更してしまうとSprite RendererのColorが機能しないことですかね。手軽に色や透明度を変更できなくなるのはだいぶ痛いです。

ちなみに反対側はどうなってるかというと…


あっ…

と、とにかく今回はここまで。裏面の対策は次回!

<次回> スプライトに影をつける ~その2~


0 件のコメント:

コメントを投稿