Unityを使った3Dゲームの作り方(かめくめ)ゲーム開発エンジンUnityを使った3Dゲームの制作に参考になる情報を公開しています。2016.02.19今回はUnityのナビゲーション機能を使って敵キャラクターを移動させてみます。今回の機能は以前作成した記事に処理を追加・修正していますので、この機能は何?と思ったら以下の記事で機能作成の流れを確認してみてください。Unityを使った3Dゲームの作り方(かめくめ)の歩き方Unityを使った3Dゲームの作り方(かめくめ)で、はじめてUnityの学習をする時の当ブログの記事を読む順番を書きました。機能を積み上げていく形になるので便利かも?gametukurikata.com2019.06.21スクリプトで目的地を設定し移動させる事は可能ですが、大草原のように周りに何もない時はいいですが、木や建物があった場合、壁などにぶつかりながら無理やり移動せざるを得ない、もしくは壁に突き進むという状態になりました。そこでナビゲーションの機能を使って敵キャラクターをスムーズに移動出来るようにします。移動出来る場所をNavMeshして作成し、移動するキャラクターにNavMeshAgentというコンポーネントを追加します。目的地を設定すれば、壁にぶつかりながら移動せず、最適な移動をしてくれます。CharacterControllerを使った移動とほとんど変わらないように見えますが、途中に壁等の障害物がある時はそれを回避し進めるようになります。スポンサーリンクNavMeshを作成しキャラクターが移動出来る場所を作成まずはNavMeshを作成し、移動できる場所を作成します。Terrainで作ったフィールドを選択しインスペクタでStaticにチェックを入れます。Terrainに関してはUnityのツールTerrainを使ってフィールドを作成するUnityのツールTerrainを使ってゲームの地形フィールドを作成していきます。gametukurikata.com2016.01.26を参照してください。NavigationウインドウUnityメニューからWindow→AI→Navigationを選択します。Navigationの使い方について少し見ていきます。AgentタブNavigationウインドウのAgentタブを選択するとエージェントの設定をすることが出来ます。Typesで+を押せばエージェントの設定を追加することが出来ます。Heightは飛び越えられる高さSlopeは登れる坂の角度です。ここで注意が必要なのがデフォルトのHumanoid以外にエージェントタイプを追加したとしてもNavigationウインドウでBakeしたフィールドには適用されないようです(2019/06/21時点)。Humanoid以外で作成したエージェントタイプが適用されるのは別途インポートする必要があるランタイムにNavMeshベイクが出来るコンポーネントを使った時だけのようです。UnityのNavMeshComponentsアセットの使い方とゲーム中にNavMeshのベイクをするUnityのナビゲーション機能でゲーム中にナビメッシュをベイクしてみたいと思います。以前はあらかじめベイクしなければいけませんでしたが、NavMeshComponentsアセットを使うと動的にナビメッシュをベイクする事が出来るようになります。gametukurikata.com2018.03.09AreasタブAreasタブはナビゲーションのコストを設定することが出来ます。コストを上げるとそのエリアを設定したゲームオブジェクトを移動する時はコストがかかる為、別のルートを使った方が最適なルートとなります。Staticにチェックされたゲームオブジェクトをベイクすることが出来ます。NavigationウインドウのBakeでパラメータを設定し、下のBakeを押します。Bakeのパラメータには移動できる範囲を設定します。Heightは超えられる段差CharacterControllerで設定するパラメータと似たようなものですね。Heightは後ほどキャラクターに設定するNavMeshAgentコンポーネントのサイズと合わせた方がいいかもしれません。Staticオブジェクトのベイクに反映されAgentタブの設定は先ほど紹介したNavMeshComponentsの設定で使われるのかもしれません。Heightはこの値以下であれば飛び降りる為のオフメッシュリンクを作成します。Distanceはこの値以下であれば飛び越えるオフメッシュリンクを作成します。オフメッシュリンクはナビゲーションエリアが切れている部分を移動する為のリンク地点です。Bakeを押すとフィールドに青い部分が表示されます。この青い部分がNavMeshAgentを設定したキャラクターが移動出来る個所になります。Areaを変更する事が出来、そこで、別のエリアを指定してからBakeすると違う色が表示されます。ObjectタブObjectタブではヒエラルキー上で選択しているゲームオブジェクトのAreaの設定が出来ます。Staticにチェックを入れます。OffmeshLinksにチェックを入れるとベイクした時にオフメッシュリンクを作成します。オフメッシュリンクは連続していない地点を繋ぐリンクのようなものです。Areaでは選択しているゲームオブジェクトのエリアを指定します。これでNavigationウインドウの使い方が分かったので実際にエリアを設定してNavMeshをベイクしてみます。Walkを作成しCostを50にします。Terrainで作ったフィールドは既にインスペクタでStaticにチェックを入れているので、ヒエラルキー上のTerrainを選択した状態でNavigationウインドウのObjectタブを選択し、AreaにWalkableを指定します。Walkを指定します。NavigationウインドウのBakeタブでBakeボタンを押してNavMeshをベイクします。これでキャラクターが移動出来る場所を設定出来ました。Costエリアなので紫色に色分けされています。上の画像ではCubeを3つ作成し、2つはベイクした時のエージェントの設定でそのまま移動出来る場所に配置し、1つはエージェントが地続きで移動出来ない少し高めに起きました。高めに置いたCubeが一番左にあるものでオフメッシュリンクが自動で作成されています。次は敵キャラクターにNavMeshAgentコンポーネントを追加します。上のように敵キャラクターにNavMeshAgentを追加します。Brakingにチェックを入れると目的地に近づいたら減速させます。Radiusは障害物を回避する半径Heightは障害物を回避する高さQualityは回避する品質の高さPriorityは指定した数値より低いエージェントの回避を無視します。MeshLinkにチェックを入れるとオフメッシュリンクのポイントに来たら自動でオフメッシュリンクを移動します。Repathにチェックを入れると部分的な移動経路の目的地についたら自動で次の経路を探索します。Maskはこのエージェントがどのエリアを移動可能にするかを選択出来ます。Triggerのチェックを外し物理的に衝突するようにします。コライダのサイズはCharacterControllerのコライダのサイズと同じにします。Kinematicにチェックを入れます。今まで敵に取り付けていたCharacterControllerの機能は使わなくなりますので削除します。主人公が敵キャラクターを武器で攻撃した時のOnTriggerEnterイベントを発生させるには、CharacterControllerがついているか、何らかのコライダ+Rigidbodyがついているキャラクターでないとダメっぽいです。キャラクターを移動させるスクリプトを修正する敵キャラクターを操作していたEnemyスクリプトの中身を変更します。CharacterControllerを使ったキャラクターの移動はUnityでキャラクターの移動をプログラミングしてみるUnityで3Dキャラクターモデルを配置し、キャラクターをCharacterControllerの機能を使って移動させるようなプログラミングをしてみます。gametukurikata.com2016.01.20を参照してください。今まではCharacterControllerのMove機能を使ってキャラクターを動かしていましたが、そこをNavMeshAgentの機能を使って移動するように修正していきます。NavMeshAgentという簡単な記述が出来ます。それ以前のバージョンであればusingディレクティブを追加する必要はありません。移動スクリプトはそれほど変わらず、目的地を設定しそこに移動するという機能をそのままNavMeshAgentの機能へと移行させるだけです。45f;NavMeshAgentを入れておくフィールドを宣言します。攻撃時に主人公キャラクターの方向を徐々に向かせる為、回転スピードのフィールドを宣言します。Startメソッド内ではNavMeshAgentコンポーネントの取得の処理を追加します。Startメソッド内でSetStateメソッドを呼び出している場合はSetStateメソッドの内でNavMeshAgentコンポーネントを使用している為、SetStateメソッドの呼び出しの前に処理を入れる必要があります。次は移動処理部分の変更です。Quaternion.LookRotation(dir);}}移動処理では今までの複雑な処理がいらなくなり、状態がMyState.Chaseだった時に主人公キャラを目的地に設定します。navMeshAgent.SetDestination(目的地のVector3);123navMeshAgent.SetDestination(目的地のVector3);でナビゲーションエージェントの目的地を設定する事が出来ます。Agentは目的地が設定されると移動を開始するので複雑な処理が必要なくなります。アニメーションパラメータのSpeedにはagent.disiredVelocity.magnitudeを渡す事にします。エージェントの現在の速度はagent.velocityでも得られますが今回はagent.disiredVelocityで回避行動による潜在的な速度を考慮したものを使う事にします。Speedにはfloat値を渡す必要があるのでmagnitudeを使って速度を速さに変換して渡しています。敵が目的地に到着したり、主人公キャラを攻撃する距離はnavMeshAgent.remainingDistanceを使用するよう変更します。{SetState(EnemyState.Attack);}}agent.remainingDistanceでエージェントの目的地との距離を取得出来ます。キャラクターが攻撃状態になったら主人公の方向を徐々に向かせるようにします。(dir);}まずは相手の位置から敵キャラの位置を引いて主人公キャラクターの方向を取得します。ここで相手方の位置のY軸だけ自身(敵)のY軸の位置にします。することでY軸以外の回転を行わないように出来ます。プレイヤーの方向を取得出来たらVector3.RotateTowardsを使って敵の方向をプレイヤーの方向へと徐々に向かせた方向dirを取得します。最後にQuaternion.LookRotationを使って方向の角度を計算し、それを敵の角度に代入しています。敵の攻撃時に主人公がその場所から逃げようとするとその方向に向きながら攻撃するのでより敵の攻撃が当たりやすくなります。次に状態変更メソッドSetStateを変更します。true;}}Unity5.6以前のバージョンではそれぞれの状態へと変更した時にエージェントの移動を止める必要がある場合はnavMeshAgent.Stop();123navMeshAgent.Stop();を使用してエージェントを止めます。移動を再開させる為に、navMeshAgent.Resume();123navMeshAgent.Resume();を使って移動の再開をしています。true;↑のようにisStoppedプロパティをオン・オフする事でエージェントの停止・再開をします。Stop(停止)に対応する場合はisStoppedにtrueを入れ、Resume(再開)に対応する場合はisStoppedにfalseを入れます。それでは敵キャラの修正が終わったのでUnityの実行ボタンを押して試してみましょう。敵が主人公をすり抜けるようになった?今までちゃんとしていたのに、敵キャラが急に主人公キャラにめり込むようになってしまった。いう方もいるかもしれません。この原因は敵の移動機能をCharacterControllerからNavMeshAgentにしたことと敵の衝突判定のコライダをCharacterControllerを使用している場合に起こります。Kinematicにチェックを入れれば主人公に衝突するようになります。NavMeshAgentが障害物として認識するようになる機能を追加するAgentに設定したキャラクターが通れる場所はNavMeshがベイクされている所だけです。NavMeshはあらかじめStaticにした動かないゲームオブジェクトを対象にしているので動くゲームオブジェクトの場合はNavMeshをベイクしても元の位置でしか反映されません。ゲームオブジェクトが動いてもあらかじめベイクされた部分をエージェントが動くことが出来て動くオブジェクトと重なってしまいます(そもそもStaticにしたゲームオブジェクトは動かさない)。そんな動くゲームオブジェクトをリアルタイムに障害物として認識させる機能がNavMeshObstacleコンポーネントです。これを動くゲームオブジェクトに取り付けて試してみましょう。ヒエラルキー上にCubeを作成し、新しくSimpleCubeMoveスクリプトを作成し取り付けます。0f);}}これでCubeがX軸をいったりきたりします。Obstacleを取り付けます。Carveの設定をチェックするとスムーズに避けるようになります。Stationaryのチェックを外すとゲームオブジェクトが動いていても有効になります。これでObstacleの設定が終わったので、実行してみましょう。Navigationウインドウを開いた状態でUnityを実行し、シーンビューでCubeを見てみます。上のようにCubeにはNavMeshObstacleを取り付けているので動いた部分のNavMeshのベイクされた部分が排除されています。ナビゲーション機能を使ってみての感想これでナビゲーションを使って敵キャラクターを移動させる事が出来るようになりました。注意点としては、NavMeshで指定するオブジェクトをStaticにしてBakeをする事です。建物等がStaticされていないとすり抜けていってしまいます。動かない障害物を作成する場合は必ずStaticにしてBakeします。BakeされたNavMeshファイルはそのシーンと同じ階層にシーン名のフォルダが作成されその中に入るようです。いやぁ、ナビゲーション機能は本当に便利ですね!設定すれば自然なルートで移動してくれますので、敵が巡回しているようなAIが簡単に作成出来ます。ナビゲーション機能では他にも使いたい機能があるので、そちらも使えるようになったら記事にしたいと思います。Unityのナビゲーション機能を使って決まった場所を巡回させるUnityのナビゲーション機能を使って決まった場所を巡回させる機能を作成していきます。gametukurikata.com2016.02.27もナビゲーション機能を扱った記事になります。コピーかめくめちゃんをフォローする7Unityを使った3Dゲームの作り方(かめくめ)Unityを使った3Dゲームの作り方(かめくめ)関連記事ナビゲーション機能Unityで主人公をナビゲーション機能とマウスクリックで移動させるUnityでキャラクターはナビゲーション機能で移動させるが、移動先の指定はマウスクリックで行えるようにします。ナビゲーション機能を使っているので障害物を避けて最適な経路で目的地に進んでくれます。ナビゲーション機能Unityのナビゲーション機能でOffMeshLinkを使って移動Unityのナビゲーション機能でキャラクターを動かす時にオフメッシュリンクを使うと地続きでない場所に移動する事が出来るようになります。ナビゲーション機能Unityのナビゲーション機能で移動エリアの可・不可を設定するUnityのナビゲーション機能でキャラクターが移動出来るエリアと移動出来ないエリアを作成します。移動出来るエリアに移動コストを設定し移動コストが大きいエリアを回避して移動できるようにしますナビゲーション機能Unityで主人公を追いかける仲間キャラクターを作成するUnityで主人公キャラに付いてくるサブキャラを作成します。主人公キャラがある程度離れたら主人公と一定の距離になるまで付いてきます。RPGのパーティの隊列のような機能も作成してみます。ナビゲーション機能Unityのナビゲーションのオフメッシュリンクの移動速度と落下速度を制御Unityのナビゲーション機能でナビメッシュリンクやオフメッシュリンクを使ってそのまま移動させるとキャラクターの移動に違和感が生じてしまいます。そこでナビメッシュリンクやオフメッシュリンクを使うときに移動速度をある程度制御して違和感を少なくしてみたいと思います。ナビゲーション機能UnityのNavMeshComponentsアセットの使い方とゲーム中にNavMeshのベイクをするUnityのナビゲーション機能でゲーム中にナビメッシュをベイクしてみたいと思います。以前はあらかじめベイクしなければいけませんでしたが、NavMeshComponentsアセットを使うと動的にナビメッシュをベイクする事が出来るようになります。Unityで敵キャラクターのHPを頭上に表示するUIを作成Unityで使うキャラクターのボーンを表示(ヒエラルキーに)する個所を限定するホームナビゲーション機能スポンサーリンクサイト内検索が出来ますプロフィール管理人のかめくめちゃんです。(-_-)メールはこちらにお願いします(記事に関する質問は送らないでください、返信は期待しないでください(._.))。kamekumechan@gmail.comいずれはSIRENやバイオハザードみたいなアクションゲームを作りたいと思っています。ゲームシナリオが書けないので面白いゲームはなかなか作れません・・・・。(^_^;)名前の由来はカメが好きだからです。プロフィールになってないな・・・・(-.-)Unityをこれから始める人へこれからUnityを使ってみようという方はUnityを使った3Dゲームの作り方(かめくめ)の歩き方Unityを使った3Dゲームの作り方(かめくめ)で、はじめてUnityの学習をする時の当ブログの記事を読む順番を書きました。機能を積み上げていく形になるので便利かも?gametukurikata.com2019.06.21の記事に記載の順番で見て頂くとUnityの基本的な使い方がわかり、簡単なアクションゲームや、TPSゲームの作成までが出来ます。自作タイピングゲームタイピングゲームを作りました。WebGL形式なのでPCのブラウザで遊べます。以下からプレイ出来ます。FinalTypingUnityを使って作成したローマ字入力のタイピングゲームです。gametukurikata.com2022.01.02お知らせ2023/01/24個人的にUnity2022.2.3f1をインストールしました。2022/10/14UnityのIKを使って足の位置と角度を地面に合わせる機能Unityのゲームでキャラクターの両足が別の高さの地面の上にある時にそれぞれの足をそれぞれの地面につけるようにする機能を作成しますgametukurikata.com2016.04.11機能を少し修正しました。2020/09/19コメント欄は閉鎖しました。今までコメントを投稿してくださった方はありがとうございました。(^^)/2018/08/07わたくしに出来る事は既に記事にしてあるので、ブログ右上の検索窓を活用してください。(._.)またブログの最初の方の機能を積み上げていく記事に関しての疑問点は当ブログ記事のスクリプトの説明と寄せられた質問への回答Unityを使った3Dゲームの作り方(かめくめ)の機能積み上げ形式の記事のスクリプトの説明と寄せられた記事の機能についての質問への回答を掲載しています。gametukurikata.com2019.08.01Unityを使い始めたばかりの人がつまづきやすい点を解消するUnityを使い始めたばかりの人が結構な確率で陥る不具合や疑問点を解消していきます。基本的にはブログに寄せられた質問への回答という感じです。gametukurikata.com2018.12.04も参照してみてください。小・中学生によるデジタルコンテンツ開発の全国大会ですuycc.unity3d.jp2022年大会の先行エントリーが開始されているようです。当ブログはハイスピードプランです。WordPressの編集画面の動作が早くなった。当ブログはハイスピードプランです。WordPressの編集画面の動作が早くなった。記事の内容に質問がある方へUnityを使った3Dゲームの作り方(かめくめ)の歩き方UnityのJavaScriptとC#を読み替えてどちらでも対応出来るようにするホーム検索トップサイドバータイトルとURLをコピーしました。