テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

【Unity】LWRPで、壁で遮られて見えないキャラクターをシルエット表示するのが超簡単にできた

f:id:tsubaki_t1:20190415213647j:plain

壁で遮られて場所が分からないキャラクターのシルエットを表示するアプローチを、LWRPでノーコーディングで実現出来たので紹介します。

壁に隠れてキャラクターが見えない問題

今回Survival Shooterのステージだけを差し替えてみる的なのを試した所、ステージ手前のオブジェクトがキャラクターを隠してしまい、何処に敵がいるのかを見つけられなくなりました。お陰で理不尽にゲームの難易度が上がり、思ったほど面白くなくなるといった事がありました。

f:id:tsubaki_t1:20190415213803j:plain

このカメラ問題の回答は色々と模索されています。例えば手前の壁を透明にする。他にもカメラの位置を上に持っていく(Cinemachine の Clear Shot)、向きは自由に変えられるので見えなくなるのは自分のせい等。今回はLWRPで面白い回避方法がGDCで紹介されていたので、それを試してみます。

Custom Forward Renderでシルエットを描画してみる

LWRP 5.7から、 Custom Forward Render を使用出来るようになりました。これで特定のレイヤー(or 描画タイプ・シェーダーパス)に所属するモデルの描画をオーバーライドしたり、描画するタイミングを変更したり複数回描画するといった事が実現出来るみたいです。

今回はソレを利用して、シーン上に表示されているプレイヤーと敵キャラクターのシルエット表示をやってみます。

f:id:tsubaki_t1:20190415214846g:plain

今回やる理屈は、下のような内容です。

  • Playerのレイヤーに所属するオブジェクトの、壁より奥(塗るピクセルのZ値がZバッファより大きい)の部分を、マテリアルをオーバーライドして塗る
  • Playerのレイヤーに所属するオブジェクトの、壁より手前(塗るピクセルのZ値がZバッファより小さい)の部分を、普通に描画する

f:id:tsubaki_t1:20190416011400g:plain

手順1:Custom Forward Rendeのセットアップ

最初にCustom Forward Rendeをセットアップします。

  1. Assets -> Create -> Rendering -> Lightweight Render Pipeline -> Forward Renderで、Forward Render Assetを作成
  2. LWRP AssetのGeneral -> Renderer TypeCustomに変更
  3. LWRP AssetのGeneral -> Dataに、先ほど作成したForward Render Assetを設定

f:id:tsubaki_t1:20190415221348j:plain

f:id:tsubaki_t1:20190415221358j:plain

手順2:Characterレイヤーに所属するモデルが壁の裏に回った時にシルエットを表示する

f:id:tsubaki_t1:20190415222613j:plain

上のように、キャラクターのシルエットを表示します。

  1. Forward Render AssetRender Features+ボタンを押しRender Objectを選択
  2. Filters -> Layer MaskPlayerを選択
  3. OverridesMaterialをシルエット表示用のマテリアルに変更
  4. OverridesDepthにチェックを入れ、Depth TestGreater(大きい)に変更

これで、塗るピクセルより手前にZ値が書かれている場合(モデルがある場合)、Overridesで指定したマテリアルで描画されます。

f:id:tsubaki_t1:20190416233550g:plain

f:id:tsubaki_t1:20190415222923j:plain

ただし、今の設定だと「Playerが遮蔽した物もシルエットとして表示」されてしまっています。例えば下の画像のように、壁からのシルエットだけでなく銃のシルエット、そして他のPlayerからのシルエットも表示されてしまっていて、余り良くないです。

f:id:tsubaki_t1:20190415223544j:plain

手順3:シルエット描画後にキャラクターを表示する

シルエットの描画後にキャラクターを表示するように変更します。

まず、Forward Render Assetの設定を変更して「Characterのレイヤーが設定されているモデルを、標準では描画しない」ようにします。 下の設定を行うと、Forward Render Assetで描画した分のみ表示されるようになります。

  1. Forward Render AssetDefault Layer MaskからCharacterを抜く

f:id:tsubaki_t1:20190415224029j:plain

次にシルエットを描画した後に明示的にCharacterレイヤーのモデルを表示します。

  1. Forward Render AssetRender Features+ボタンを押しRender Objectを選択
  2. Filters -> Layer MaskPlayerを選択

これで、ステンシル描画後にキャラクターが描画されるので、キャラクターが期待通りに表示されます。ついでにキャラクター同士が被った場合もシルエットになりません。

f:id:tsubaki_t1:20190415224826j:plain

なお、コレを応用するとプレイヤーと敵の色違いのシルエットとかも出せます。手順2で敵用のシルエットを描画して、手順3で描画する対象に敵も含めるだけ。

f:id:tsubaki_t1:20190415230013j:plain

特許

この割と海外のゲームでよく見る「壁の向こうのキャラクターのシルエットを表示する」表現は、特許が既に登録されています。ご利用は計画的に

j-platpat

関連

www.youtube.com

2Dで、シルエットではなく手前のステージを消すタイプ

tsubakit1.hateblo.jp

【Unity】新しいステルス系チュートリアル「John Lemon's Haunted Jaunt(ジョン・レモンのお化け屋敷)」

f:id:tsubaki_t1:20190413222752p:plain

ステルスゲーム系の新しいチュートリアル「John Lemon's Haunted Jaunt」が追加されました。

Unity Learnにて公開しています。

John Lemon's Haunted Jauntというゲーム

John Lemon's Haunted Jauntは、簡単に言えば脱出ゲームです。

ルールは非常に単純です。

  • ジョンはお化け屋敷にいる
  • お化け(動き回るタイプと、周辺を見るだけのタイプが居る)の視点を回避する
  • ゴールに到達するとゲームクリア
  • お化けに見つかるとゲームオーバー

Stealthであったような「アイテム回収」や「NavMeshで敵が追跡してくる」といったアクションはオミットされ、単純に巡回するお化けを回避するだけのゲームです。

f:id:tsubaki_t1:20190413223132j:plain

チュートリアル

チュートリアルは下のページから確認出来ます。英語なので、翻訳すると良いです。

learn.unity.com

f:id:tsubaki_t1:20190413223828j:plain

チュートリアルの内容は「セットアップ済みのプロジェクトをどうやって構築するか」といった内容で、オブジェクトの配置やセットアップといった項目、ステージ作成やゲーム構築といった諸々の部分が排除された、この手順通り作ったら動かせるといった内容でした。

Unityの操作方法を理解するといった点では分かりやすいかなという印象です。ただ、このチュートリアルを通しても自分のゲームは作れないかもしれません。

タイトル 内容
Setting up 3D Beginner Unityの概要です。UnityEditorのインターフェースについての説明が含まれます
The Player Character: Part 1 キャラクターの配置やアニメーションの設定、あとPrefabについてです
The Player Character: Part 2 キャラクターをスクリプトで動かす方法の紹介です
The Environment ステージのライティング設定とNavMeshの設定についてです
The Camera CinemachineとPostProcessingStackの説明です
Ending the Game ゲームクリア処理と、UIについての説明です
Enemies, Part 1: Static Observers 動かない敵(ガーゴイル)の作り方です。キャラクターの発見処理等とゲームオーバーが含まれます
Enemies, Part 2: Dynamic Observers 動き回る敵(ゴースト)の作り方です。NavmeshとWaypointによる移動についてです
Audio 音楽や歩行時の足音の再生方法、影響範囲等についての紹介です。
Build, Run, Distribute ゲームのビルド手順についての紹介です。

スクリーンショット

主人公のJohn君。意外と表情が豊かです。ToonShaderを使用しています。

John君はGeneric Avatarを使用している上にRootMotoinを使用した移動なので、モデルをサクッと差し替えられない点に注意です。

f:id:tsubaki_t1:20190413230619j:plain
主人公のJohn君。ビビリ

動き回るゴーストは、半透明のエッジのも表示シェーダーを使用しています。

f:id:tsubaki_t1:20190413230918j:plain
動き回るゴースト

ガーゴイル君、意外とモーションが可愛い。

f:id:tsubaki_t1:20190413230951j:plain
自宅警備員ガーゴイル

出口は明るく表示されています。

f:id:tsubaki_t1:20190413231046j:plain
出口

ステージはパーツごとに分割されており、並べ替えがやりやすくなっています。ただフロアは完全にメッシュを持ってきているので、フロアのレイアウトだけは変更出来ません。やるならProBuilderで作るとか色々する必要があります。

f:id:tsubaki_t1:20190413232111j:plain
ステージの並べ替え

f:id:tsubaki_t1:20190413232304j:plain
ステージのレイアウト

館の周辺はボリュームフォグっぽい表現で塗られています。ゲームからは見ることは出来ません。

f:id:tsubaki_t1:20190413232222j:plain
ボリュームフォグっぽい表現

【Unity】GDC 2019のセッション動画が公開

GDCで行われたUnityのセッション動画の幾つかが公開されました。

Keynote

Keynoteです。

www.youtube.com

2時間見るのが面倒くさいという場合は、下の記事が凄い分かりやすいです。

www.famitsu.com

またGDCの映像の裏で雑談放送もやってました。

www.youtube.com

セッション一覧

www.youtube.com

動画が間違ってる奴や、今後増えそうな感じなのでとりあえず一覧ページのみ

【Unity】Unityのリアルタイムレイトレーシング用ビルドが公開

f:id:tsubaki_t1:20190406230819p:plain

UnityでRTXを試せるビルドが公開されました。

デモ

下のデモでは、リアルタイムレイトレースと実際の車を交互に表示しています。殆ど見分けが付きません。

動かせるオブジェクトで間接光や反射といった表現が出来るのは面白いですね

www.youtube.com

カスタムエディター

現状、パッケージとしてではなくUnityエディターのカスタムビルド…しかもUnityエディターを丸ごとGithubに配置するという漢らしい雑さっぷりです。

https://github.com/Unity-Technologies/Unity-Experimental-DXRgithub.com

マニュアルはこちら

https://github.com/Unity-Technologies/Unity-Experimental-DXR/blob/master/documentation/The%20Experimental%20DXR%20project%20manual.pdfgithub.com

質問や議論はコチラ

Unity - Unity Experimental HDRP DXR - Unity Forum

試したかった

色々と試した結果、我が家のGeForce GTX 950Mでは無理だった事を思い出しました。( ˘ω˘)スヤァ…

当然ですが、RTXが可能なグラボが必要です。

そろそろ新しいのに買い替えたい所はありますが、以前にコレがあったので正直何処のメーカーの何を買えば良いのか分からんっていう。

tsubakit1.hateblo.jp

静音性が高くてコンパクト…は無理ですよねぇ

関連

以前のUniteでの講演は結構面白い

www.youtube.com