ブルーノのC#プログラミング & unity勉強日記

プログラミング素人、ブルーノの自主勉強ノートです。他のプログラミングを勉強したい方の助けになれば幸いです。その他趣味の雑記もしていきたいです

No.002 進捗状況11[NavMesh]

f:id:covory10101101276:20190418202157j:plain
氷河急行(グレッシャー・エクスプレス) -スイス-

みなさんこんにちは🌚

一口サイズに材料を切るのが苦手なブルーノです。

では今回も新しいオブジェクトを作っていきたいと思います。
ところで最近Youtube仮面ライダーカブトの動画を見たんですが、これも今私が作っているゲームと同じく時間を圧縮した中で敵との戦いを繰り広げるといった内容で、とてもかっこいいんですね。というか、このゲームの元ネタはぶっちゃけこの仮面ライダーカブトです。そして仮面ライダーには敵がつきもので、このカブトの敵も超高速で動くため常人には捉えられないんですね。というわけで、今回作るオブジェクトは「超高速で動き回る敵」にしたいと思います。そして動かす敵は、街を作った際にノリでストアから手に入れたこの人にしようと思います。
f:id:covory10101101276:20190418210130p:plain
にしてもなんでこのゴリラおしゃぶりしてるんだろう。では頑張っていきます。

NavMesh
昔Unityの勉強の記事で少しだけ触れたNavMesh、自動で歩ける道を判別しその上をAIが勝手に動いてくれるという代物を今回は使いたいと思います。こちらのサイトを参考にしました。というか、まんまこのサイト通りです。毎回お世話になっています。kanさん。
kan-kikuchi.hatenablog.com

まずはテスト用のフィールドと、ゴリラを配置。
f:id:covory10101101276:20190418211033p:plain
Window→AI→Navigationを開き、Objectタブから歩かせたいエリアに該当するオブジェクトを選択し、NavigationStaticにチェック。
f:id:covory10101101276:20190418211618p:plain
NavigationAreaは[Walkable]を選択しておきます。
f:id:covory10101101276:20190418211709p:plain
準備ができたらBakeしましょう。

f:id:covory10101101276:20190418211859p:plain
ここでも足場の設定が色々できる模様
そしたら今度は、ゴリラにNavMeshAgentというコンポーネントをつける。これだけ。なんて簡単なんだ。
f:id:covory10101101276:20190418212605p:plain
動きを速くするため、SteeringのSpeed, AngulerSpeed, Accelerationを、アホみたいに速くしてみました。これらはそれぞれマリカでいうスピード、曲がりやすさ、加速ですね。
あ、さきほどこれだけと言いましたが、最後にスクリプトから目的地を設定してあげる必要がありました。嘘ついてごめんなさい。
しかし目的地の設定も、NavMeshAgent.destinationにVector3型の座標を指定するだけ。そこで今回は、目的地をこんなオブジェクトにしてみました。
コライダー だけのCubeを用意し、時間経過もしくはゴリラが触れることで特定の座標を移動する目的地です。
f:id:covory10101101276:20190418213826p:plain
f:id:covory10101101276:20190418213916p:plain
これでゴリラが常にある目的地を目指して走り出すはず.....とおもったんですが......
f:id:covory10101101276:20190419184342p:plain
ゴリラが恥ずかしいことになったまま走り回ってるんですが.....原因を調べてみると、どうやらこのアセットにもともとついていたAnimationが、NavMeshと競合してしまっているようです。
NavMesh Agent を他のコンポーネントと共に使う - Unity マニュアル
NavMeshAgentは独自のPhysicsとAnimationコンポーネントを持っているらしく、そのまま一緒に使うと競合を起こしてしまい正常に機能しないようです。ちなみに競合というのは複数のプログラムなんかが同じデータを使おうとして競り合ってしまうことです。まあゴリラがブルブルするアニメーションは今回いらないのでアニメーションは今回は捨てることにしました。Animationコンポーネントを外すと...
f:id:covory10101101276:20190419185449p:plain
直りました。が、今度はまた別の問題が。ゴリラが速すぎてプレイヤーの当たり判定が貫通してしまいました。
f:id:covory10101101276:20190419192152p:plain
どうやらこれは物理演算の関係上速い動き全てを計算すると負荷がかかってしまうのでコマ送りになってしまっているそうです。というのも全てこちらのサイトに書いてあったんですよね笑
【Unity】物理演算で動かすオブジェクトが壁を貫通する問題と対策 - テラシュールブログ
というわけでゴリラにRigidbodyコンポーネントをつけてCollision Detectionを[Continuos Dynamic]にします。ちなみにIs KinematicにチェックをつけないとNavMeshAgentと競合を起こします。
f:id:covory10101101276:20190419193117p:plain
そして...
f:id:covory10101101276:20190419193331p:plain
Debug.log()メソッドでゴリラの衝突を確認
成功しました。今回はここまでにしておきます。