テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

【Unity】目的地へ辿り着くための矢印を表示する

f:id:tsubaki_t1:20160803232953j:plain

今回は、ゲームで道に迷った(哲学的な意味ではない)際の目安となる、目的地への道順を示す矢印の表示についてです。

ゲーム進行の矢印

2Dアクションゲームでも、3DRPGでも、目的地が何処にあるのか分からなくなると簡単にクソゲーなります

 

ということで、出来る限りゲームをスムーズかつ簡単に体験して貰うために、道を示すというのは中々に悪くない選択肢です。多分。
まぁ、AAAなゲームではステージの配置やライティング、カットシーン等により「ユーザー自身の気づき」で移動先を見出すのが最もクールだと思いますが、ソレを見落として道に迷った末に止めたゲームを自分は何本か持っています。

矢印を示す方法は幾つかありますが、今回はプレイヤーの上に矢印を表示する方法について考えてみます。

方向を示す3つの方法

目的地までの移動先を示す方法ですが、ざっと考えて3つ思いつきました。

  • ゴールの方向だけを見るするパターン
  • 中間点の方向を示すパターン
  • 経路を探索して方向を取得するパターン

実際にどんな内容か考えを詰めてみます。

ゴールに至る方向だけを示すパターン

まず思いついたのが、ゴールの方向を示すパターンです。

ルートに関わらず矢印だけを示すので、実は回り道するようなケースでは逆に惑わされる事もありますが、逆に考えれば「気付き」を与える機会でもあります。

凄くシンプルな表示ですが、無いよりは遥かに良いです。

f:id:tsubaki_t1:20160803234456j:plain

実装は非常にシンプルです。とにかく、カーソルが対象を向けば良いのです。という事で、Lookatメソッドを使って強引に向けます。

gist.github.com

中間点で方向を示すパターン

ゴールに至る方向だけを示すパターンでは、回り道のような道がある場合、道に迷うかもしれません。そこで、ゴールとスタートの間に中間点を設置し、中間点の位置へ向けて矢印を示すパターンを考えてみます。

f:id:tsubaki_t1:20160803235837j:plain

中間点に近づいたら、次の中間点を示す感じで進むので、開発者敵に進む方向を提示しやすそうです。

gist.github.com

これを少し応用してるのが、StandardAssetsのUtilityに含まれるWaypointシリーズかなと思います。あっちは目標点に向けて移動ですが。

tsubakit1.hateblo.jp

経路を探索して方向を得るパターン

もう一つが、経路探索で最短経路を得るパターンです。経路探索で行うので、道順を間違えた場合でもルート再検索を行ってくれます。
但し、経路探索AIを動かすのでゲームによっては余計な負荷を生むかもしれません。また、Navmeshを設定できない所には移動出来ません。

f:id:tsubaki_t1:20160804002045j:plain

これを行うには、幾つか設定する必要があります。

まずはNavmeshをベイクします。

tsubakit1.hateblo.jp

f:id:tsubaki_t1:20160804001934j:plain

次に、NavmeshAgentを用意します。基本的にNavmeshAgent自身に動させる事は無いので、streeting系のパラメータは全部0に設定しておきます。

f:id:tsubaki_t1:20160804005120j:plain

後は経路探索で移動先を得て、向かうべき方向へ矢印を向けます。
NavmeshAgentは経路を更新してもらうために使っていいるので、移動や向きを変更する機能は使いません。よってupdateRotationupdatePositionにfalseを設定して移動しないようにします。後、NavmeshAgentの基本位置を移動するため、nextPositionに常に現在地を流し込んでいます。

後はagent.steeringTargetで次の曲がり角の座標を取得し、ソコに向けて矢印を向けるだけです。

gist.github.com

f:id:tsubaki_t1:20160804005006g:plain

関連

tsubakit1.hateblo.jp

tsubakit1.hateblo.jp

tsubakit1.hateblo.jp