(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

(:3[kanのメモ帳]



指定した座標を順に移動させるDOTweenのDOPathで進行方向に体を向かせる方法と各座標の到達検知【Unity】【DOTween】


このエントリーをはてなブックマークに追加


この記事でのバージョン
Unity 2018.4.20f1
DOTween Pro 1.0.178


はじめに

Unityで位置や大きさなどのアニメーション、

いわゆるTweenを実装するアセットとしてお馴染みのDOTween

DOTween Pro | Visual Scripting | Unity Asset Store


今回はそのDOTweenの機能のうちの一つであるDOPathの紹介的な記事です。

DOPathは名前の通り指定した座標を通るようなパスを作成して、その通りに移動するというもので、

イメージとしては以下のような感じ。

f:id:kan_kikuchi:20200521183544g:plain


なお、記事中では以下のアセットを使っています。

Animals - Simon the Raccoon | 3D Animals | Unity Asset Store



DOPath

さっそくDOPathの使い方からですが、

一番シンプルなのは移動する座標(Vector3)の配列と移動時間を指定する方法です。

なお、DOLoacalPathにするとローカル座標での移動になります。

/*transformはアライグマのtransform*/
//指定した2つのポイントを通るように4秒かけて移動する
transform.DOPath(
    path       : new Vector3[] {new Vector3(0, 0, 4), new Vector3(4, 0, 4)}, //移動するポイント
    duration   : 4f //移動時間
);
f:id:kan_kikuchi:20200521181219g:plain


ちなみにScene上に移動するルートが表示されるのも地味に嬉しかったりします。

f:id:kan_kikuchi:20200521181049j:plain



曲線的に移動

さきほどの例では直線的に移動をしていましたが、

pathTypeにPathType.CatmullRomを指定する事で滑らかな曲線で移動する事も可能です。

//指定した2つのポイントを通るように4秒かけて曲線的に移動する
transform.DOPath(
    path       : new Vector3[] {new Vector3(0, 0, 4), new Vector3(4, 0, 4)}, //移動するポイント
    duration   : 4f, //移動時間
    pathType   : PathType.CatmullRom //移動するパスの種類
);
f:id:kan_kikuchi:20200521181100j:plain



オブジェクトの座標を元に移動

「特定のオブジェクトの場所を通過したい」みたいな場合はLINQのSelectを使うと簡単に実装出来ます。

//通過したいオブジェクト達(Inspectorで設定)
[SerializeField]
private List<GameObject> _targets;
//通過したいオブジェクトを通るように10秒かけて曲線的に移動する
transform.DOPath(
    path       : _targets.Select(target => target.transform.position).ToArray(), //移動する座標をオブジェクトから抽出
    duration   : 10f, //移動時間
    pathType   : PathType.CatmullRom, //移動するパスの種類
);
f:id:kan_kikuchi:20200521183403g:plain


さらにSetLookAtを使う事で移動中の向きを変える事が出来ます。

なお、第一引数で何秒後の地点を基準にするか、第二引数で見る方向を指定します。

//通過したいオブジェクトを通るように10秒かけて曲線的に移動する
transform.DOPath(
    path       : _targets.Select(target => target.transform.position).ToArray(), //移動する座標をオブジェクトから抽出
    duration   : 10f, //移動時間
    pathType   : PathType.CatmullRom, //移動するパスの種類
)
.SetLookAt(0.05f, Vector3.forward); //0.05秒後に通過する場所を見るように
f:id:kan_kikuchi:20200521183411g:plain


さらにさらにOnWaypointChangeを使うことで、各座標に到達した事を検知する事も出来ます。

transform.DOPath(
    path       : _targets.Select(target => target.transform.position).ToArray(), //移動する座標をオブジェクトから抽出
    duration   : 10f, //移動時間
    pathType   : PathType.CatmullRom //移動するパスの種類
)
.SetLookAt(0.05f, Vector3.forward) //0.05秒後に通過する場所を見るように
.OnWaypointChange(pointNo => { //通過したオブジェクトを非表示にする
  if (pointNo > 0) {
     _targets[pointNo - 1].SetActive(false);
  }
});
f:id:kan_kikuchi:20200521183544g:plain



プログラムなしで実行する方法

ここまではプログラムからパスを指定して実行していましたが、

DO Tween PathというコンポーネントをAddする事でプログラムなしで実装する事も可能です。

f:id:kan_kikuchi:20200521185301j:plain


自動で実行するかのAutoPlayや、移動時間のDuration等の設定はもちろん

パス自体もScene上をSHIFT +CMDを押しながらクリックする事で指定出来ます。

f:id:kan_kikuchi:20200521185317g:plain


ただし、Retinaディスプレイだとクリックした座標がズレるので使えないっぽいです。