Raspberlyのブログ

Raspberlyのブログ

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

【アセット紹介】Enemy Vision - Patrol and Line of Sight でステルスゲームを作る【Unity】

今回はアセットの紹介をしていきます。
紹介するのはEnemy Vision - Patrol and Line of Sight
ステルスゲームにおける敵の挙動を構築するアセットです。

f:id:Raspberly:20210830015458p:plain

f:id:Raspberly:20210830022515p:plain



 

お得なセール情報(終了しました)

現在アセットストアでは、プロトタイピング向けアセットのバンドルを発売中!
今回紹介する「Enemy Vision - Patrol and Line of Sight」もバンドルに含まれています。

f:id:Raspberly:20210823232118p:plain

金額に応じてアセットが異なりますが、オススメは全てのアセットが含まれた$21.99コースです。
通常の50%OFFセールで購入するよりも安く購入できるので、
気になるアセットがある場合は買っちゃいましょう!

f:id:Raspberly:20210823205628p:plain

 

f:id:Raspberly:20210823205647p:plain

f:id:Raspberly:20210823205732p:plain

 

 

 

 

どんなアセット?

ステルスゲーム向けのアセットです。
敵の視界、巡回機能システムを構築できます。

コンテンツ-
敵のビジョンコーン-ビジョンコーン
は障害物に適応します-
敵の行動:パトロール、アラート、チェイス-パトロール
:設定されたパス
に従って移動します-アラート:好奇心をそそられ、疑わしい場所に
歩きます
-チェイス:プレイヤーに向かって走ります-地面の高さ、敵は高台にいるときにのみあなたを見ることができます。
-オプションの2レベルのビジョンコーン(
近視と遠視-近視範囲は、警告を受ける代わりにプレーヤーを即座に検出します。
-ノイズゾーン(プレイヤーがそれを踏むと、近くの敵に警告します)。
-ノイズを放出するために任意のオブジェクトおよび関数呼び出しに追加できるノイズソース。
-使用と構成が簡単

-2D および3Dのサポート-優れたパフォーマンスと最適化の設定

 

2D、3D両方で使えるアセットですが今回は3Dをメインに扱います。

 

すぐに動作確認ができるデモが用意されています。

2Dデモ

3Dデモ

 

 

 

 

開発環境

Unity2020.3.14f1

Enemy Vision - Patrol and Line of Sight ver2.02

 

 

 

インポートの確認

アセットインポート完了時はこんな感じです。

f:id:Raspberly:20210830015250p:plain

 

URPプロジェクトの場合

このアセットはSRP関係なく動きますがデモシーンはBuilt-inを想定したものになっています。
そのためURPで動かす場合はマテリアルのアップデートを行っておきましょう。

f:id:Raspberly:20210829221039p:plain

 

デモシーンの確認

Assets/IndieMarc/EnemyVision/Scenesにデモシーンが用意されています。
ステージ内を警官がパトロールしていて、視界に入ると追いかけてきます。

f:id:Raspberly:20210830022533g:plain

ノイズを発生させる赤いポイントがあり、そこを踏むと近くの敵が調べにやってくる機能もあります。

 

 

 

 

主要コンポーネント

このアセットを使いこなすうえで重要なコンポーネントを紹介します。

Enemyコンポーネント

Enemyの移動を管理するコンポーネントです。
移動速度、NavMeshAgentの有無、ステージの巡回機能もあります。

f:id:Raspberly:20210830013721p:plain

 

EnemyVisionコンポーネント

視界を管理するコンポーネントです。
視界の範囲、発見状態に移行するまでの時間、見失ってから追跡終了までの時間などを設定できます。

f:id:Raspberly:20210830013928p:plain

UnityEventが用意されているので、発見時や警戒時に何かさせたい時はコールバック関数を登録しましょう。
これに関してはEnemy Demoコンポーネントが参考になります。

 

VisionConeコンポーネント

視界を可視化して表示するコンポーネントです。
Assets/IndieMarc/EnemyVision/Prefabs/VisionConesに最初から用意されているので、直接触ることはないと思います。

f:id:Raspberly:20210830014858p:plain

 

VisionTargetコンポーネント

Playerにアタッチするコンポーネントです。
これがないとEnemyに検知されません。

f:id:Raspberly:20210830013635p:plain



 

 

実際に試してみる

3Dのシーンで実際に試してみます。

ステージとキャラクターの配置

壁用の適当な仕切りとしてCubeを、敵用のキャラクターとしてSDユニティちゃんを配置します。

f:id:Raspberly:20210830001156p:plain

NavMeshを生成するため壁、地面オブジェクトのNavigation Staticを有効にします

f:id:Raspberly:20210830001909p:plain

その後、NavMeshをBake。

f:id:Raspberly:20210830003200p:plain

これでステージ作りは完成です。

f:id:Raspberly:20210830003315p:plain

 

Enemyの設定

空のGameObjectを作成し名前を「Enemy」にします、SDユニティちゃんを子オブジェクトにします。
視点の位置用に空のGameObjectを作成し名前を「Eye」にします。

f:id:Raspberly:20210830003607p:plain

EyeはSDユニティちゃんの目元当たりに置いておきます。

f:id:Raspberly:20210830005607p:plain

 

Enemyオブジェクトには、EnemyコンポーネントEnemyVisionコンポーネントNavMeshAgentコンポーネントEnemyDemoコンポーネントをアタッチします。

f:id:Raspberly:20210830010601p:plain

 

Enemyコンポーネント

デフォルトでは移動速度が速いのでSpeedを調節し、Use_pathfindを有効にします。
これが有効だとNavMeshAgentを使って移動します。

f:id:Raspberly:20210830011257p:plain

 

Enemy Visionコンポーネント

視界の範囲はデフォルトのまま、参照だけ設定します。
Eyeには先ほど作ったEyeオブジェクトをアサイン、
Vision_prefabにはAssets/IndieMarc/EnemyVision/Prefabs/VisionCones/VisionConeアサインします。

f:id:Raspberly:20210830011533p:plain

 

Enemy Demoコンポーネント

Exclama_prefabAssets/IndieMarc/EnemyVision/Prefabs/Others/Exclamationアサイ
これでプレイヤー発見時に「!」マークが出ます

f:id:Raspberly:20210830012317p:plain

 

アニメーションの設定

AnimatorとAnimationはアセットで用意されているものをそのまま使います。
SDユニティちゃんのAnimatorAssets/IndieMarc/EnemyVision/Animations/3D/Characterをアタッチします。

f:id:Raspberly:20210830012508p:plain

 

ただし、このアニメーションはHumanoidではなくGenericなのでAnimationTypeを変更します。
Assets/IndieMarc/EnemyVision/Modelsにある以下のオブジェクトのAnimationTypeをHumanoidにしてApply。

f:id:Raspberly:20210830010442p:plain

 

Playerの設定

PlayerにはVisionTargetコンポーネントをアタッチします。

f:id:Raspberly:20210830013635p:plain

 

これで完成です。
Playerが視界に入るとEnemyが追いかけてきます。

f:id:Raspberly:20210830022906g:plain

 

 

 

巡回機能を使う

せっかくなのでEnemyを巡回させてみます。
ステージ上の巡回させたい位置に空のGameObjectを作成します。

f:id:Raspberly:20210830020634p:plain

f:id:Raspberly:20210830020652p:plain

作成したGameObjectをEnemyコンポーネントPatrol_pathアサイン。

f:id:Raspberly:20210830020737p:plain

 

これで完成です。

f:id:Raspberly:20210830023835g:plain

 

明るいと見えにくいですが、シーンビュー上でも赤い線で巡回箇所が表示されます。

f:id:Raspberly:20210830021057p:plain

 

トロールタイプ

巡回する時の動き方が3種類用意されています。

f:id:Raspberly:20210830021430p:plain

Rewind:最後のPatrol_pathまで移動したら、順番に引き返す

Loop:最後のPatrol_pathまで移動したら、最初の位置に戻り同じルートで巡回を開始する

Facing Only:移動はせず、Patrol_pathに登録した位置を向くだけ

 

 

 

 

まとめ

・Enemy Vision - Patrol and Line of Sightはステルスゲームにおける敵の挙動を構築するアセット
・2D、3D両方で活用できる
・視界と巡回機能が用意されている

 

いろいろさわってみてわかりましたがかなり丁寧に作られています。
ドキュメントは簡素で、コンポーネントやデモ用スクリプトがとてもわかりやすかったです。

 

 

 

 

他の方の解説記事

temoshiblog.com

 

 

 

他のアセットの紹介記事はこちら↓

raspberly.hateblo.jp

 

 

 

※本記事にはAssetStoreアフィリエイトリンクが含まれています。

他、間違っている箇所、わかりにくい所がありましたらコメントにお願いします。