Raspberlyのブログ

Raspberlyのブログ

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

【アセット紹介】Sensor Toolkit でNPCの視界を作ろう【Unity】

今回はアセットの紹介をしていきます。
紹介するのはSensor Toolkit
視界を簡単に作ることができるセンサーアセットです。

f:id:Raspberly:20210712034341p:plain

f:id:Raspberly:20210712030819p:plain

 

 

 

お得なセール情報

現在アセットストアでは、サマーセールが開催中!
7週間にわたってテーマ別にセール対象アセットが変わります!

 

今週のテーマは3Dゲーム開発向けアセットです。
詳しくは↓のバナーからどうぞ!

f:id:Raspberly:20210712030240j:plain

今回紹介する「Sensor Toolkit」もセール対象です!

 

セールのスケジュール

  • 1週目:低ポリゲーム-2021年6月22日-6月28日
  • 2週目:2Dゲーム-2021年6月29日-7月5日
  • 3週目:3Dゲーム-2021年7月6日-7月12日
  • 4週目:ファンタジーゲーム-2021年7月13日-7月19日
  • 5週目:SFゲーム-2021年7月20日-7月26日
  • 6週目:ドリームプロジェクト-2021年7月27日-8月9日

3週目の終了時間は日本時間で7月13日15:59までです。

blog.unity.com

 

どんなアセット?

レイキャストやコライダーを使って、
キャラクターの視界となるセンサーを簡単に作ることができるアセットです。
センサーだけでなく、視界に最適なコライダーもあります。

f:id:Raspberly:20210712025844g:plain

Sensor Toolkitは、ゲームオブジェクトに配置して、スクリプトやPlayMakerアクションと簡単に統合できる2Dおよび3Dセンサーコンポーネントのコレクションです。これは、レイキャストやトリガーコライダーなどのUnityの基本的なセンシング機能に加えて便利な抽象化ですが、多くの利点があります。軽量で高度な機能を備えており、幅広い問題に適用できます。

 

 

ドキュメントはこちら

www.micosmo.com

 

 

 

開発環境

Unity2020.1.7f1

Sensor Toolkit ver1.6.5

 

 

 

インポートの確認

アセットインポート完了時はこんな感じです。
メインとなるコンポーネントはトップに配置されています。

f:id:Raspberly:20200930021248p:plain

 

Examplesの中にデモシーンが含まれています。

f:id:Raspberly:20200930021340p:plain

Actionシーン

2つのチームに分かれたBotがお互いに戦いあっているシーン

f:id:Raspberly:20200930024734g:plain

Stelthシーン

WASDとマウスで操作するステルスゲーム
このアセットのイメージに一番合うかも。

f:id:Raspberly:20201006032441g:plain

 

 

 

 

主要コンポーネント

このアセットを使いこなすうえで重要なコンポーネントを紹介します。
パラメータはたくさんあるので重要なやつだけ。

FOVCollider

コーン状の視野を提供するコライダーコンポーネント。キャラクターの視野にぴったりです。
コーンはStart時にメッシュが動的に生成されます。

f:id:Raspberly:20210711224409p:plain

パラメータ

Length:視野の長さ

BaseSize:視野のサイズ(視野開始地点側の大きさ)

FOVAngle:視野の角度(横方向の角度)

ElevationAngle:視野の仰俯角(上下方向の角度)

Resolution:円弧の頂点の数(可能な限り少ない方がいいらしい)

f:id:Raspberly:20210712025638g:plain

FOV Colliderはセンサーコンポーネントではないのでこれ単体で探知などはできません。
TriggerSensorコンポーネントと併用しましょう。

 

 

センサーコンポーネントの共通機能

センサーはGameObjectを検知しリスト化します。センサーから離れたときにリストから削除されます。
検知時とセンサーから離れた時にイベントを発行します。

共通のパラメータ

センサーごとにちょっと違いはある

Ignore List:センサーで検出しないGameObjectのリスト。視線を遮ることはある

Enable Tag Filter:Trueにすると、TagFilterに含まれるオブジェクトのみ検知する

Detects On Layers:探知するオブジェクトのレイヤー。初期値Nothingなので注意

Detection Mode:検出モード。Rigid bodiesの場合Rigidbodyがないと無視される

Update Mode:Sensorの更新モード。毎フレームだったりインターバルを指定したり

Requires Line Of Sight:視線が通っているオブジェクトのみ検出する

Events:検知及び見失った時に呼ばれるイベントを設定

 

 

RangeSensor

Sphereのセンサーコンポ―ネント。範囲内のコライダーかRigidbodyを検出します。
一定間隔ごとに検出するほか、手動(任意のタイミング)で検出させることも可能。
(内部的にはPhysics.OverlapSphereを使用しています)

f:id:Raspberly:20210712013944p:plain

パラメータ

Sensor RangeSphereのサイズ

f:id:Raspberly:20210712010426p:plain

 

 

 

RaySensor

Rayを使うセンサーコンポーネント
Rayの長さや検出するレイヤー、それを遮るレイヤーにより構成されます。
RauCastHitを使うため、接触点や表面法線、ブロックしたコライダーを取得できます。

f:id:Raspberly:20210712013911p:plain

パラメータ

Length:Rayの長さ

Radius:Rayの半径、0より大きい場合spherecastを使用します

Direction:Rayの方向

World Space:Directionの値がWorldSpaceかLocalSpaceか

f:id:Raspberly:20210712025723g:plain

 

 

SteeringRig

ステアリングベクトルを計算するコンポーネントです。
障害物をナビゲートするのに使われます。子オブジェクトにRaySensorを配置して使いますが、
SensorToolkit / SteeringRigPrefabsにすぐに使えるPrefabが用意されています。

f:id:Raspberly:20210712013130p:plain

 

 

Trigger Sensor

isTriggerなコライダーを使うセンサーコンポーネントです。(ColliderとRigidbodyが必須)
一般的によく使われる検出方法ですが、設定は慎重に行う必要があります。
OnTriggerEnterとOnTriggerExitで検出を行いますが不要なものを検出する可能性もあります。

f:id:Raspberly:20210712014346p:plain

 

BoxColliderなど自前のColliderで探知できます。
前述のFOV Colliderと併用すると簡単に視界を作成できます。

f:id:Raspberly:20210712014809p:plain

 

 

 

 

 

 

実際に試してみる

FOV ColliderとTrigger Sensorでキャラクターの視界を作ってみます。

 

キャラクターの用意

お馴染みSDユニティちゃんを使います。これはなんでもいいです。

f:id:Raspberly:20210712025523p:plain

 

 

センサーコンポーネントの設定

ユニティちゃんの子オブジェクトに空のゲームオブジェクトを作成し、
FOV ColliderTriggerSensorコンポーネントをアタッチします。パラメータはこんな感じです。

f:id:Raspberly:20210712031431p:plain

 

UIの作成

発見状態かどうかわかりやすいようUIを作成します。これはなんでもいいです。

f:id:Raspberly:20210712032030p:plain

 

スクリプトの作成

以下のSensorTestを作成します。
探知時と見失った時に呼ばれる2つのメソッドを定義しています。
やっていることはそれぞれUIをオンオフするだけです。


TriggerSensorの設定でPlayerタグ以外のオブジェクトは探知しないようにしているので、
オブジェクトの識別処理を入れる必要はありません。(とても便利)

using UnityEngine;

public class SensorTest : MonoBehaviour
{
    public GameObject m_DetectIcon;

    public void Detect(GameObject _gameObject, SensorToolkit.Sensor _sensor)
    {
        m_DetectIcon.SetActive(true);
    }

    public void Lost (GameObject _gameObject, SensorToolkit.Sensor _sensor)
    {
        m_DetectIcon.SetActive(false);
    }
}

このスクリプトを、先ほど作った空のゲームオブジェクトなど適当な場所にアタッチします。

 

 

イベントの設定

TriggerSensorコンポーネントのEventにSensorTestのメソッドを登録します。

f:id:Raspberly:20210712032500p:plain

 

 

これで完成!
FOV Colliderの範囲内に入ると探知されているのがわかります。
壁の遮られたり、範囲内に出ると見失っていますね。

f:id:Raspberly:20210712025844g:plain





 

まとめ

・Sensor Toolkitを使うとキャラクターの視界が簡単に実装できる
・4種類のセンサーコンポーネントと視界用のColliderが用意されている


このような視界システムは自作している方が多いと思います。
Colliderを使って開発するのが一般的(Unityのチュートリアルなど)ですが、
視界用のFOV Colliderが用意されているのがとてもうれしいですね。

センサーコンポーネントも視点が通っているかの判定や、
タグ・レイヤーによる探知範囲の設定など便利な機能がそろっているので、
ステルスゲームや戦闘ゲームを開発している方にオススメのアセットです。

 

アセットストアでも人気順上位です!評価も高い!

 

以上です。 

 

 

 

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

raspberly.hateblo.jp

 

 

 

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

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