Raspberlyのブログ

Raspberlyのブログ

Unityネタをメインとした技術系ブログです。にゃんこ大戦争や日常なども。そろそろブログタイトル決めたい

【Unityネタ】Unityでスコープや監視カメラを作る

この記事はUnity #2 Advent Calendar 2020、17日目の記事です。
昨日は@drumath2237さんによる、「【Unity】muscleを使用した指制御入門」でした。

 

今回はUnityネタをやっていきます。テーマは「Unityでスコープをつくる」です。

f:id:Raspberly:20201218001932p:plain

アクションシューティングゲームでは銃にスコープがついていますが今回はこれを作っていきます。
そのまま望遠鏡として使うだけでなく、監視カメラの映像を写したりと応用もできます。
仕組みとしてはRender Textureを使います。

使用アセット

今回はこちらのアセットを使用します。スナイパーライフルの3Dモデルです。

 

 

 

スコープの作成

Cameraの映像をRender Textureに書き出し、レンズに出力するとこまでやってみます。

 

Render Textureは画像や映像をリアルタイムで描画できるテクスチャです。Unityマニュアルから引用。

Render Texture (レンダーテクスチャ) は、ランタイムに作成、更新される特殊な テクスチャ です。使用するには、まず新しいレンダーテクスチャを作成し、カメラ の 1 つを指定して、そこにレンダリングします。次に、通常のテクスチャのように、マテリアル のレンダーテクスチャを使用できます。Unity Standard Assets の ウォーター プレハブは、リアルタイムの反射と屈折を作成するために、レンダーテクスチャを現実世界で使用する例の 1 つです。

 

 

CameraとRender Textureの作成

Main Cameraとは別に、スコープ用のCameraを作成します。
Cameraはライフルのスコープの先端当たりに置いておきましょう。
(Audio Listenerが2つあるとエラーがでるため注意)

f:id:Raspberly:20201218010310p:plain

 

ProjectビューにRender Textureアセットを作成します。

f:id:Raspberly:20201217173431p:plain

f:id:Raspberly:20201218002443p:plain

スコープ用CameraのTarget TextureRender Textureを紐づけます。

f:id:Raspberly:20201217173922p:plain
これで、Renderer TextureにCameraの映像が出力されます。

 

Materialの作成

レンズに表示するためのMaterialを作成します。
Materialを作成せず直接Render Textureを貼り付けてもいいですが、
シェーダーを適応したり細かい調整を行いたい場合はMaterialの方が便利です。

f:id:Raspberly:20201218002543p:plain

 

Materialを作成したら、AlbedoにRender Textureを紐づけます。

f:id:Raspberly:20201218005235p:plain
これでMaterialは完成です。

 

Render TextureをCylinderに表示

レンズ型のオブジェクトがないのでプリミティブのCylinderをレンズの形に改造して使用します。

Y軸のScaleを小さくすることでレンズ状にできます。

f:id:Raspberly:20201217190043p:plain

作ったレンズは、スコープの手前側に配置します。

f:id:Raspberly:20201218011304p:plain

CylinderのMesh Rendererに作ったMaterialを与えるとCameraの映像が描画されます。

 f:id:Raspberly:20201218005434p:plain

f:id:Raspberly:20201218011402p:plain

 

 

今回はスコープですが、監視カメラの映像をモニターに出したい場合はQuadがオススメです。
Quadは映像や画像を出力するのに向いているオブジェクトです。

docs.unity3d.com

 

 

 

スコープの見栄えを変える

明るく表示する

Standardシェーダーをパラメータを変えずそのまま使っているので、Directional Lightによっては暗く表示されてしまいます。
Emissionを有効にすると発光し見やすくなります。

f:id:Raspberly:20201217180909p:plain

細かい色味などはカラーピッカーから調整できます。

f:id:Raspberly:20201218011453p:plain

ライティングの影響を完全に無視したい場合はUnlit/Textureを使うのも手です。

Cameraをズームする

CameraコンポーネントField of View(FOV)の値を調整することでズームできます。
値を小さくするとズームイン、大きくするとズームアウトされます。

f:id:Raspberly:20201218011718g:plain

ポストエフェクトをつける

スコープ用のCameraにPost Processing Stackなどをアタッチすることで質感を出すことができます。
Vignetteがおすすめ。クロスヘアもあるといいですね。

f:id:Raspberly:20201218012107p:plain



 

銃のスコープとして使う場合

銃のスコープとして使うには少し工夫が必要です。
スコープにあるCameraの位置と弾の生成位置が異なるため、そのままだと狙った場所にあたりません。


これについては、以下のtogetterで@tail_y氏のツイートがまとめられています。

togetter.com

 

銃のスコープに使うのならば、スプラトゥーンのように銃の射線上にrayを飛ばし、
当たった場所にCameraを向ける方法がよさそうです。

時間がないためソースコードなどはあとで

 

 

 

その他 おすすめアセット

FREE PBR Security Camera

監視カメラとモニターのモデルが含まれている無料アセットです。
同じくRender Textureで監視カメラを再現しているデモシーンが含まれています。

 

Low Poly Weapons Pack + Sight Shader

スコープ付きライフルはこちらのアセットがおすすめです。
モデルの種類が多く、スコープ用シェーダーもついていて便利です。
有料アセットですが、2019/2/4~4/11まで無料だったため入手していた方はラッキー

 

VRでも試してみる

作ったスコープ付きスナイパーライフルと上で紹介したFREE PBR Security CameraVRで試してみました。
スコープと監視カメラが問題なく動作しています。

f:id:Raspberly:20201218012733g:plain

 

監視カメラのアセットには、この記事と同じようにCameraとRender Textureが設定されています。

スマートフォンはQuadを画面部分に張り付け、監視カメラのRender Textureをマテリアルとして与えています。

f:id:Raspberly:20201218013314p:plain
VRの注意点として、スコープを使う場合はプレイヤー側のCameraのClipping PlanesのNearを小さくする必要があります。
でないと、スコープをのぞくときにめり込みます。

 

 

 

以上です。
スコープや監視カメラなどにぜひお役立てください。

 明日のUnity #2 Advent Calendar 2020 担当は@neusstudioさんです。

 

 

参考資料

www.atmarkit.co.jp

haru-android.hatenablog.com

docs.unity3d.com

 

 

 去年のUnity Advent Calenderの記事はこちら

raspberly.hateblo.jp

 

 

 わかりにくいところなどがありましたら、コメントにお願いします。