[Unity][UnitySteer]UnitySteer導入

  • SumoMe

UnitySteerとはGameObjectに対して状況にあわせた振る舞いをさせるためのAssetです。日本語ドキュメントはおろか、ドキュメントが公式にも存在していないようです。今回は、Youtubeで唯一と言っても良い導入動画に沿って導入の説明をします。さらにこの動画ではあまり効果が確認できませんので、若干の変更を加えて少し動きを複雑にしてみます。

UnitySteer

UnitySteerはCraig Reynolds氏が開発している「Open Steer」をUnityのAssetと作成したものです。詳しくはこちらのサイトで解説しています。

ゲームは初心者にやさしく: Unity AIの実現にUnitySteerを活用する~その1
http://gamesonytablet.blogspot.jp/2012/10/unity-aiunitysteer_15.html

UnitySteerはArgres systemのサイトで状況のアナウンスがあり、Githubにてソースコードが配布されています。利用は、AssetStoreからダウンロードすることができますが、Githubから最新版をダウンロードするほうが懸命でしょう。

UnitySteer « Arges Systems – Unity3D experimental game and AI development
http://arges-systems.com/blog/category/unitysteer/

ricardojmendez/UnitySteer · GitHub
https://github.com/ricardojmendez/UnitySteer

チュートリアルビデオ

以下の動画をポイント毎に解説していきます。

解説

インストール

インストールは以下の順に行います

  1. ダウンロード
  2. プロジェクトのAssetへコピー

ダウンロードはUnitySteerのGithubへブラウザでアクセスし、ZIPファイルをダウロードします。ダウンロードしたファイルを解凍し、フォルダが作成されます。(00:15〜)

Unityを起動し、組み込みたいプロジェクトを開いてAssetへコピーします(01:10〜)。もし、プロジェクトがければ作成し、起動したプロジェクトとは別のプロジェクトで利用したい場合は、メニューから新しいプロジェクトを作成してください。(00:43〜)

オブジェクトの作成

Cubeオブジェクトを2つ用意し、「Unit」と「Nose」という名前にします。(01:30)

2つのオブジェクトを以下のように親子関係とします。この時、Unitの子にNoseがなるようにしてください。

Unit 
  |---Nose

Unitを選択し、Inspectorから新しいレイヤーを追加します。UserLayer8に「Unit」という名前をつけます(01:54〜)。UnitオブジェクトのレイヤーをUnitレイヤーに設定します。(02:00〜)

コンポーネントの付加

Raderの付加 (02:15〜)

Unitを選択した状態で、メニューのComponent->UnitySteer->Radar->Raderを付加する。Raderは指定の半径のColliderオブジェクトを取得し、その中からVehicleコンポーネントが付加されたオブジェクトのみを操作対象とする。Inspectorで「Layers Checked」を「Unit」レイヤーへ変更する。すると、Unitレイヤーに属するものにしぼられる。

Bipedの付加(02:30〜)

Unitを選択した状態で、メニューのComponent->UnitySteer->Vehicle->Bipedを付加する。Vehicleはオブジェクトの動く速度や回転などのまさに”エンジン”となるコンポーネントです。

Rigidbodyの付加(02:50)

Unitを選択した状態で、メニューのComponent->Physics->Rigidbodyを付加する。Inspectorでどうコンポーネントの「Use Gravity」をオフ、「Is Kinematic」をオンにします。この作業で、物理シミュレーションが適用されますが、位置などは衝突などでは変化しなくなります。

Steer For Separationの付加 (03:00〜)

Unitを選択した状態で、メニューのComponent->UnitySteer->Steer->…for Separationを付加する。「Weight」を2へ変更、「Layers Checked」をUnitを指定。このコンポーネントはSteerの一種で、向きを決定する”ステアリング”の一種です。このコンポーネントはAngleで指定した範囲に入るオブジェクトに対して「距離を保つ」ために方向を決定する処理をします。

Steer For Cohesionの付加(03:17〜)

Unitを選択した状態で、メニューのComponent->UnitySteer->Steer->…for Cohesionを付加する。「Layers Checked」をUnitを指定。このコンポーネントはSteerの一種です。範囲内に入ったオブジェクトに近づく効果があります。

Steer For Alignmentの付加(03:29〜)

Unitを選択した状態で、メニューのComponent->UnitySteer->Steer->…for Alignmentを付加する。「Layers Checked」をUnitを指定。このコンポーネントはSteerの一種です。範囲内に入ったオブジェクトを整列させます。

Steer For Pintの付加(03:40〜)

Unitを選択した状態で、メニューのComponent->UnitySteer->Steer->…for Pointを付加する。このコンポーネントはSteerの一種です。指定した「Target Point」へ追従します。

編集

UnitのPrefab化(03:52〜)

Unitを選択し、InspectorのTransformのPositionを<0,0,0>とする。Noseを選択し、移動ツールでZ軸(青い矢印)へ少し移動させ、InspectorのTransformのScaleを<0.2,0.2,0.2>とする。Unitに色を付加するために、Materialを用意する。Materialの名前を「Solider」とし、緑色にする。Soliderをドラッグ、Unitの上へドロップし、マテリアルを付加する。一度コンポーネントを確認し、UnitをドラッグしProjectウインドウでドロップするとPrefabとなる。Prefabを作成したら、HierarchyのUnitは削除する。

Unitを配置(05:27〜)

ゲームオブジェクトを作成し、「Squad」とする。このゲームオブジェクト以下にUnitを実体化させてまとめて管理する。Projectウインドウの「Unit」Prefabをドラッグし、Hierarchyの「Squad」でドロップする。すると、Prefabが実体化する。実体化したUnitを合計で6つになるように複製する。実体化されたUnitをそれぞれの座標へ移動させる。全てのUnitを選択し、「SteerForPoint」の「Target Point」の値を<50,0,50>とする(07:22〜)これで、全てのUnitがTargetPointで指定した位置へ移動しようとする。

カメラの配置(07:38〜)

カメラ(Main Camera)をUnit群の先頭のオブジェクトにドラッグ&ドロップし、Unitの子とする(Noseの兄弟となる)。Unitの子とすることで、Unitが移動するとカメラも追従する。カメラを選択し、実行時に見たい角度へとSceneのプレビューを移動し、メニューのGameObject->Align Width Viewを押すと、プレビューの視点がカメラの視点となる。(07:43〜)

実行(07:54〜)

実行ボタンを押すと、UnitはSteerの設定に従って移動します。実行中にオブジェクトをSceneウインドウで強引に移動した場合もその設定に従って移動を続けます。

ステアリングの確認

実はこのサンプルはあまり良いサンプルだとは言えません。ほとんどがSteer For Pointから受ける影響で挙動が一辺倒です。そこで少し手を加えて、Steeringの挙動を確認してみましょう。

Steer For Point以外を無効化してみる

Unitを全て選択し、Steer For Point以外のSteer(Cohesion, Alignment, Separation)のチェックを外して実行してみましょう。動きはかわりましたでしょうか。

Unitを全て選択した状態で解除したSteerをOnやOffにして色々確かめてください。

挑戦してみよう

Unit群の先頭以外のSteer For PointをOffにして、Unit群の先頭が本来の目的地に進むようにして、残りのUnitがその先頭Unitに追従するようにしてみてください。

おわりに

UnitySteerは高性能なライブラリです。効果を得るには「Rader」「Vehicle」「Steer」の3つのコンポーネントを付加しなければなりません。また、それぞれは継承し、オリジナルのスクリプトとして作成、拡張することで非常に強力になります。