(:3[kanのメモ帳]

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

(:3[kanのメモ帳]



DOTweenでRigidbody(2D)を使った当たり判定のある移動をする方法【Unity】【DOTween】


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


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


はじめに

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

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

DOTween Pro | Visual Scripting | Unity Asset Store


今回はそのDOTweenで当たり判定がある、つまりすり抜けない移動をする方法の紹介です。

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

f:id:kan_kikuchi:20200519181637g:plain


DOTweenでRigidbody(2D)を使った当たり判定のある移動をする方法

DOTweenはtransformのDOMoveを使う事で簡単に移動処理を実装する事が出来ますが、

これだとtransform.positionを操作した時のように頻繁にすり抜けます。

//(-4.27, 0, -7.34)に0.5秒で移動
transform.DOMove(new Vector3(-4.27f, 0, -7.34f), 0.5f);
f:id:kan_kikuchi:20200519181819g:plain


そもそも上記のように記述できるのは、

TransformにDOMoveという拡張メソッドが実装されているからなのですが、

実はTransform同様にRigidbodyにもDOMoveという拡張メソッドが実装されています。

しかもRigidbodyのDOMoveは内部でRigidbodyのMovePositionを使っています(=当たり判定がある)


つまり当たり判定がある移動をしたい場合はRigidbodyのDOMoveを使えば良いという事です。

//(-4.27, 0, -7.34)に0.5秒で移動(移動中も当たり判定有り)
gameObject.GetComponent<Rigidbody>().DOMove(new Vector3(-4.27f, 0, -7.34f), 0.5f);
f:id:kan_kikuchi:20200519182108g:plain


さらにRigidbodyにはDOMove以外にもDORotateやDOPath等の拡張メソッドも実装されており、

それらも、もちろん当たり判定があるTweenになります。

(DOPathについてはこちらの記事参照の事)

//TransformのDOPath(移動中の当たり判定がない)
transform
.DOPath(_targetList.Select(target => target.position).ToArray(), 2, PathType.CatmullRom)
.SetLookAt(0.01f, Vector3.forward));
f:id:kan_kikuchi:20200519182257g:plain


//RigidbodyのDOPath((移動中も当たり判定有り)
gameObject.GetComponent<Rigidbody>()
.DOPath(_targetList.Select(target => target.position).ToArray(), 2, PathType.CatmullRom)
.SetLookAt(0.01f, Vector3.forward);
f:id:kan_kikuchi:20200519181637g:plain


なお、DOTweenのRigidbodyの拡張メソッドを使う際は

RigidbodyのIsKinematicは有効にしておく必要があります。

f:id:kan_kikuchi:20200519181218j:plain


ちなみにRigidbody2Dも同様にDOMove等の拡張メソッドが用意されています。