Unityに関連する記事です

 2回の手順に分けて、プレイヤー用の移動範囲の制限機能を実装します。
下記の動画は、次の手順まで完成した際の動画です。


<Game ビュー 実装動画>
動画ファイルへのリンク



以下の内容で順番に実装を進めていきます。

手順7 ーNavMesh の作成ー

 ・NavMesh の説明
 ・NavMesh の作成



1.NavMesh の説明

1.設計


 NavMesh(ナビメッシュ) とは、事前にゲームオブジェクト上に経路の情報を作成しておく機能のことです。
NavMesh を作成することで、その範囲内のみで、NavMeshAgent コンポーネントが自動的に経路の計算を行い、
障害物を避けて AI による移動を行わせる機能を実装出来ます。

 これは NavMeshAgent コンポーネントを利用し、NavMesh 内でのみ AI の自動経路移動の処理を行うということになりますが、
逆説的に考えると、NavMeshAgent コンポーネントは、NavMesh の経路以外の場所には移動できないということを担保するとも言えます。



 今回の実装では、この NavMesh と NavMeshAgent コンポーネントの機能を利用し、
プレイヤー用のゲームオブジェクトの位置が NavMesh の経路内である場合、NavMeshAgent により、ゲームオブジェクトを移動させる機能を付与します。
ここまでは本来の NavMeshAgent の機能と同じですが、プレイヤー用のゲームオブジェクトを AI によって自動的に動かすことが目的ではありません

 経路以外の場所を移動できないという部分を利用して、ゲームオブジェクトの移動範囲を制限するという副次的な部分を活用することが目的です。
そうすることにより、コライダーの接触判定を利用せずに、プレイヤー用のゲームオブジェクトの移動範囲を制限するということを実現できます。

 最初に提示している Game ビューの動画の移動範囲を Scene ビューで確認すると、次のようになっています。
青い部分が移動可能な範囲(NavMesh により、NavMeshAgent が経路として認識している部分)。
それ以外の部分は経路ではないため、侵入できない場所として認識されている部分です。


<Scene ビュー 実装動画>
動画ファイルへのリンク



 ステージ上には、プレイヤー用のゲームオブジェクトが移動する際に、障害物となる多くのゲームオブジェクトが配置されていると思います。
それらすべてにコライダーをアタッチして、コライダー同士の接触判定をして移動範囲を制限する、という方法もありますが、大変な作業になります。

 今回は移動範囲を制限する方法として、コライダーではなく、NavMesh とNavMeshAgent コンポーネントの機能を使ってカバーしようという設計になります。

 そのためには、NavMesh の準備と設定を事前に行っておく必要がありますので、
この手順ではそちらの準備を行っていきます。
 

2.NavMesh


 NavMesh の機能を利用し、経路内を自動的に移動させる機能を実装します。


参考サイト
Unity 公式マニュアル
ナビゲーションと経路探索
Unity 公式マニュアル
Unity の ナビゲーションシステム


 ここでは公式マニュアルのみを紹介しましたが、他にも良い記事が多くありますので、自分で調べて学習しておきましょう。


3.NavMeshAgent コンポーネントの競合


 NavMeshAgent コンポーネントには、他のコンポーネントとの競合が発生します。
 
 Rigidbody コンポーネントを一緒にセットする場合、NavMeshAgent の自動経路移動の機能を利用したい場合には、
IsKinematic をオンにする(チェックを入れる)必要があります。

 また、NavMeshObstacle コンポーネントを一緒にセットしても正常に機能しません''。

 どちらもマニュアルに記載されています。
他にも競合するものがありますので、利用する際には一度マニュアルに目を通して注意するように心がけましょう。


参考サイト
Unity公式マニュアル
NavMesh Agent を他のコンポーネントと共に使う


2.NavMesh の作成


 この手順では NavMesh を作成していきます。
作成後でも構いませんので、公式マニュアルを読んでおくことをお勧めします。


参考サイト
Unity 公式マニュアル
ナビメッシュの作成


1.NavMesh としたいゲームオブジェクトの static にチェックを入れる


 NavMeshAgent コンポーネントのによる AI による経路移動を行うためには、事前に NavMesh を作成しておく必要があります
そのため、まず最初に移動範囲と障害物に設定したい(NavMesh にしたい)ゲームオブジェクト側への設定が必要になります。

 経路の範囲と障害物に指定したいゲームオブジェクトを選択し、インスペクター上部の右側にある static にチェックを入れます


<ゲームオブジェクトの static にチェックを入れる>



 static のチェックを入れたゲームオブジェクトに子オブジェクトが存在する場合には、
この操作に合わせて子オブジェクトも static にするか確認するポップアップが開きますので、
そちらも Yes, chnage children を選択して、指定したゲームオブジェクト全体を static の設定にします。


<子オブジェクトが存在する場合には、子オブジェクトも static にする>



 複数のゲームオブジェクトを選択することも可能ですので、経路として指定したいゲームオブジェクトすべてに static の設定を行います。

 今回であれば Stage ゲームオブジェクトの Static にチェックを入れることで
子オブジェクトであるすべてのゲームオブジェクトが Static に設定できます。親子関係を上手く活用しましょう



 なお、static にチェックを入れたゲームオブジェクトは静的ゲームオブジェクトとして扱われます。
そのため、Sceneビュー内でのドラッグアンドドロップも、Transform コンポーネントによっても、移動や回転は行えなくなります。(スクリプトからの制御も出来ません。)
 
 動的(通常の)ゲームオブジェクトではない代わりに''ゲーム内において移動・回転をしないことを条件に、
事前計算用のゲームオブジェクトとして(今回であれば経路の範囲として)指定できる''ようになっています。

 以上でゲームオブジェクト側の設定は完了です。



 Static 設定にはオプションがあります。
今回は設定していませんが、初期設定のままですと Bake だけではなくてゲームオブジェクト自体も移動できなくなります。

 ゲームオブジェクトは動的に移動させたいが、Bake はしておきたい、という場合には、
Navigation Static にだけチェックを入れるようにすることで実現できます。


Static 設定



2.Navigation ビュー内で NavMesh の Bake を行う(NavMesh を作成する)


 続いて、static に設定したゲームオブジェクト上を AI が移動経路内(NavMesh)であると判断するために Bake(ベイク) 作業を行います
この Bake 作業が NavMesh を作成する作業と同意になります。

 Bake とは焼き付けの意で、この作業を行うことで、static のゲームオブジェクトと Bake の設定とを判断し、移動可能な経路を生成します。

 Unity の左上のメニューの中から Window > AI > Navigation を選択してください。
Navigation ウインドウが開くか、インスペクタータブの横に Navigation ビューのタブが追加されます。
インスペクターのビューを Navigation ビューに切り替えてください。


Inspector ビューを Navigation ビューに切り替える



 Navigation ビュー内にある Bake タブを選択し、右下にある Bake ボタンを押してください
Scene ビュー内に水色の経路が表示されれば、Bake 成功です。NavMesh が作成されました。
こちらの Bake して出来た NavMesh が NavMeshAgent コンポーネントが AI によって移動できる範囲になります。
 
 Bake して作成された NavMesh の情報は自動的にセーブされます
 


 Navigation ビューを選択していると、Scene ビューに青い範囲が表示されます。
これが Bake によって登録された NavMesh であり、NavMeshAgent コンポーネントが移動可能になる範囲を可視化したものです。
活用しましょう。


Scene ビュー



Scene ビュー



Scene ビュー



Bake のみ(ステージ用のゲームオブジェクトを非表示にすると、Bake のみ = NavMesh を確認できます)



 Navigation ビューではなくインスペクタービューに切り替えると、Bake している青い範囲は見えなくなります。
Bake 範囲を確認したい場合には Navigation ビューに切り替えるようにしてください。


3.Bake の注意点


 Bake される情報は static ゲームオブジェクトの配置から算出されますが、
新しいゲームオブジェクトを追加したり、あるいはゲームオブジェクトを移動させた場合には、Bake した範囲は自動的には再計算されません

 そのため、Scene 内のゲームオブジェクトの配置をやり直したら、必ずもう一度、Bake を行い、NavMesh を作成し直す必要があります


<ゲームオブジェクトと Bake した範囲がずれているケース>



 以上で Bake は完成です。これで NavMeshAgent コンポーネントを利用する準備が整いました。
 


 以上でこの手順は終了です。

 => 次は 手順8 −NavMeshAgent を利用した、キャラクターの移動範囲の制限機能の実装− です。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu



技術/知識(実装例)

2Dおはじきゲーム(発展編)

2D強制横スクロールアクション(発展編)

3Dダイビングアクション(発展編)

2Dタップシューティング(拡張編)

レースゲーム(抜粋)

2D放置ゲーム(発展編)

3D脱出ゲーム(抜粋)

2Dリアルタイムストラテジー

2Dトップビューアドベンチャー(宴アセット使用)

3Dタップアクション(NavMeshAgent 使用)

2Dトップビューアクション(カエルの為に〜、ボコスカウォーズ風)

VideoPlayer イベント連動の実装例

VideoPlayer リスト内からムービー再生の実装例(発展)

AR 画像付きオブジェクト生成の実装例

AR リスト内から生成の実装例(発展)

private



このサイト内の作品はユニティちゃんライセンス条項の元に提供されています。

管理人/副管理人のみ編集できます