2011年6月25日土曜日

Unity3D:AstarPathfindingを使ってみる

AssetStoreではSimplePathが大人気ですがオレはこちらを使うぜ!

A* Pathfinding2.9

どうもSimplepathではNavMeshとかが使えないくさい。
Terrainオブジェクトを使って同じようなことはできるっぽいけど。
なんでこちらのAronさんのをありがたく使わせていただきます。
Unity3.5でPathFinding実装されるっぽいけどちょっと待ってられない。

解説書きますが例によって英語でOKって方はAronさんのHPの
ほうがよいです。

Get Started With A*, part 2

Get Started With A*, part 3

今回はNavMeshを使ったやり方を紹介します。

1.まずはAronさんのサイトからAstarPathfindingをDLしてください
記事を書いてる時点の最新版は2.95でした。
ちなみに商業用途での使用の場合はたしか料金が発生します。
くわしくはAronさんのサイトで。

2.DLしたZIPを解凍して任意の場所に保存。
Unityを起動しメインメニューのAsset→ImportPackge→CustomPackageから
解凍したフォルダにあるallRequiredAssets2_95.unitypackageを選択
インポートのダイアログが開くのでとりあえず全部インポート。






















2.空のgameObjectを作成し、名前を A* とします。
そして、Pathfindingフォルダ内のAstarPath(C#)をA*に追加します
下図のようなメニューが作成されるはずです。






















SceneViewの方に四角いコンテナが作成されるので
Width Depth Offsetの値を変更して下図のようにNavMeshを内包するように設定してください。
ちなみにOffsetのYは0ではなくマイナス値にしといたほうが
余計なエラーがでないよ。的なことがAronさんのTutorialに書かれてました。

















設定できたらスクリプトのメニューからMeshをえらんで
NavMeshの項目にメッシュを設定(オブジェクトではないです)
ShowDebugをオン、Scaleは人それぞれですが自分は1にしました

で設定したらイザScanMap!!



















あれ?ずれた…
どうも元のNavMeshのトランスフォームに回転や移動値が入ってるとずれるみたい
MeshRotationとかOffsetを調整して何度かやってると無事ピッタリ合いました。






















これでNavMeshの設定は完了です。
では次にキャラクターにスクリプトを設定してみます。
プレイヤーであるペンギン君とエネミーのゾンビ君です。
今回はゾンビ君がペンギン君を追い回すというのをやってみたいと思います。






















ゾンビを選択し、以下のスクリプトを適用します。
Seeker
AIFollow
AIAnimation
CharactorController

AIFollowとAIAnimationスクリプトはインポートしたパッケージの中には入っていないので
解凍したフォルダ内のAsset→Scriptの中から持ってきてください。
CharactorControllerはUnityの標準のものです。すでにシリンダーのコライダー等が
設定されている場合はreplaceしてください。
たぶんほとんどいじらなくても大丈夫なんですが今回の場合は
AIFollowスクリプトのcontinousTargetSearchをONにしています。
あとAIFollowスクリプトのTargetにPlayer(ペンギン君)を設定。

これで基本設定は完了です。
で、プレイすればゾンビがペンギンを追っかけます。


…ま、そんなすんなりといくはずがないので
自分の方で遭遇したエラーを紹介しときます。
基本うまく行っている場合、以下のような表示がでます。










んでこんなのがでました。










ターゲット(ペンギン君)がグリッド内にいない場合にでるエラーです。
NavMeshをScanMapした際、コンテナがNavMeshにフィットして最適化されるため
ターゲットが地面から少しでも浮いているとコンテナの外に出てしまいます。
この場合、Mesh設定のBoundsMerginを2とかに設定するとエラーが出なくなりました。
要は余白を作ってあげるということかと。
また同じようなエラーでStartPointというエラーもでました。
これは上のほうで書いたOffsetのYが0の場合に頻発しました。
これもOffsetにマイナス値をいれると直りました。

とりあえず以上です。

0 件のコメント:

コメントを投稿