マクドナルド
数年ぶりにマクドナルドへ行ってみたら店員が余りに淡々と無表情のまま接客してくるので途中から「ロボットと会話してるのかな?」と思った皆さんこんにちは。メニューから「スマイル0円」の記載が消えたのは知っていましたが、店員から笑顔が消えていることは初めて知りました。「ありがとうございました。」の一言もない
前回からの続き
そんな感じで、周りへの要求だけは人一倍高くて肝心のゲーム開発は遅々として進まない日々を過ごしている今日この頃ですが、前回の記事ではUnity標準で用意されているRotateAroundメソッドを使用したオブジェクトの公転運動について取り上げました。
RotateAroundはTransformコンポーネントのメソッドなので、公転運動させたい場合はUpdate関数等でオブジェクトのTranformをRotateAroundで随時変更することになります。
この為、例えば方向キーを押していたら一定速度で公転する、みたいな処理は簡単に実装できるのですが、10秒で90度公転する、みたいな処理を実装しようとするとちょっと面倒くさい。
これが通常の移動処理であればDOTweenのDOMove,DORotate等を利用するところですが、残念ながらDOTweenにはRotateAroundに相当するメソッドは用意されていません。
(ちなみにJobSystemのJobParallelForTransformでもRotateAroundを利用することはできません)
DOTweenのToを利用する
無いのならそれっぽいのを作ってしまおう、というわけでDOTweenのToを利用する方法を考えます。
指定した時間で指定した角度公転させるメソッドを想定して、DOTween.Toにて指定した時間でTransform.RotateAroundに渡す角度を指定角度まで変えるようにしたら、それっぽいメソッドになるのではないか。
例えば10秒で90度公転させる場合は、DOTween.Toにて角度を格納する変数を10秒で0~90まで変更させ、その更新タイミングでTransform.RotateAroundを実行します。
Transform target; // 移動対象オブジェクト Transform origin; // 公転原点 float prevVal; // 前回の角度 public Tween DoRotateAround(float endValue, float duration) { prevVal = 0.0f; // durationの時間で値を0~endValueまで変更させて公転処理を呼ぶ Tween ret = DOTween.To(x => RotateAroundPrc(x), 0.0f, endValue, duration); return ret; } /// <summary> /// 公転処理 /// </summary> /// <param name="value"></param> private void RotateAroundPrc(float value) { // 前回との差分を計算 float delta = value - prevVal; // Y軸周りに公転運動 target.RotateAround(origin.position, Vector3.up, delta); // 前回の角度を更新 prevVal = value; }
RotateAroundで指定する角度は1フレーム分の回転角度なので、RotateAroundPrcでは前フレームからの差分を求めてRotateAroundを実行しています。
動作を確認。ちゃんと指定時間で指定角度分公転しています。
利点
公転の処理自体はTransform.RotateAroundを利用しているので、DOTween.Toを使わずともUpdate関数でも同じような処理を実装できますが、この手法ではDOTweenのオプション(EasingやLooop等)を利用するとができます。
上記のソースでSetEase()オプションを追加して、EasingにOutBounceを指定した結果が下の動画です。
同じ公転角度、時間ですが最初の動画と動きが全く違うことが分かります。
また他にもOnComplete等のコールバックも使えるので結構利点は多いと思います。