読者です 読者をやめる 読者になる 読者になる

テラシュールブログ

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

特定ルートを巡回したりする方法[Unity]

Unity AI Navmesh スクリプト

ゲームを作成している内に、村人や敵兵を特定のルート巡廻させたり、障害物を特定ルートで動かしたり、レーシングゲームでカートを周回させたり等々、そういったギミックを作りたくなります。

 

この「Unityで特定のルートを巡回する」方法は、パっと思いつく限り、以下の3つの方法が考えられます。

一つがAnimationで巡回アニメーションを作成してしまう方法、二つ目がTweenで時間指定でオブジェクトを移動させてしまう方法です。この二つは非常に簡単に巡回システムを構築することが出来ます。そして3つ目が、Navmeshを利用した巡回です。

 

アニメーションが汎用的ならばAnimation、汎用的で無いならTween、地形が複雑ならNavmeshを選択すると良さそうです。

 

アニメーションを使用した巡回

アニメーションを使用した巡回は巡回の中でもっともシンプルです。たとえば、特定のオブジェクトの周りを巡回するアニメーションを作ってしまえば、それで済みます。

 

アニメーションで巡回を行うコツは、最初と最後を先に作成してしまう事です。

  1. アニメーションを行うオブジェクトの親オブジェクトを作成します。アニメーションを行うオブジェクトの初期座標はposition(x:0, y:0, z:0)がお勧めです。
  2. AnimationのTransform.Positionの項目を「Add Curve」で追加します。
  3. 最初の座標から動かさずアニメーションの終了秒数まで赤いカーソルを持っていき「Add Key」で終了秒にキーを打ちます。
  4. 巡回ルートにキーを打ちます

これでオブジェクトが巡回するようになります。単純な障害物回避ゲームでは、下手にTweenやNavmeshを行うより手軽に障害物を設定できて便利です。

f:id:tsubaki_t1:20141003234302p:plain

f:id:tsubaki_t1:20141003234533p:plain

f:id:tsubaki_t1:20141003234542g:plain

 

なお、Animationの座標は「相対座標」である事に注意して下さい。つまり、使用するときは「アニメーションを行う子オブジェクト、座標を設定する親オブジェクト」のような関係で構築します。

これはAnimationが取る座標が親オブジェクトとの相対座標であるため、ルート直下に作成してしまうと、アニメーションが汎用的に使えなくなる為です。

 

Tweenを使用する

Tweenを使用する場合はアニメーションと似ており、アニメーションと比較してもっと面倒かつ柔軟に設定します。

基本的にiTween Visual Editor等のTweenでパスを生成し、そこを巡回させる感じで作成します。


[Unity][iTween]iTween Visual Editor導入と解説 | CHO DESIGN LAB

 

Navmeshを利用した巡回

Navmeshを利用した巡回は、ある程度座標から外れてもリカバーできる事と、障害物をある程度自動的に回避できる事が特徴です。例えばカーブのようなTween制御では若干面倒な所も、そこそこスムーズに移動する事ができます。

 

f:id:tsubaki_t1:20141005225958g:plain

 

この実装イメージはとても簡単で、すなわち「目標地点に到達したら次の座標」を考えればよいです。ただし単純に全オブジェクトが距離換算しているととても高い負荷になってしまうため、そのあたりは工夫が必要かもしれません。

下のコードでは、wayPointに巡廻ポジションを設定することで、巡廻を行うようにしています。


UnityのNavmesh Agentで巡廻させるコード