原カバンは鞄のお店ではありません。

Unityを使ったゲーム制作のあれこれを綴っていきます。

【Unity】DOTweenを使って公転させたい

マクドナルド

数年ぶりにマクドナルドへ行ってみたら店員が余りに淡々と無表情のまま接客してくるので途中から「ロボットと会話してるのかな?」と思った皆さんこんにちは。メニューから「スマイル0円」の記載が消えたのは知っていましたが、店員から笑顔が消えていることは初めて知りました。「ありがとうございました。」の一言もない

 

前回からの続き

そんな感じで、周りへの要求だけは人一倍高くて肝心のゲーム開発は遅々として進まない日々を過ごしている今日この頃ですが、前回の記事ではUnity標準で用意されているRotateAroundメソッドを使用したオブジェクトの公転運動について取り上げました。

 

www.karvan1230.com

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を実行しています。

 

f:id:Karvan:20200218211223g:plain

 動作を確認。ちゃんと指定時間で指定角度分公転しています。

 

利点

公転の処理自体はTransform.RotateAroundを利用しているので、DOTween.Toを使わずともUpdate関数でも同じような処理を実装できますが、この手法ではDOTweenのオプション(EasingやLooop等)を利用するとができます。

 

上記のソースでSetEase()オプションを追加して、EasingにOutBounceを指定した結果が下の動画です。

f:id:Karvan:20200218211355g:plain

同じ公転角度、時間ですが最初の動画と動きが全く違うことが分かります。
また他にもOnComplete等のコールバックも使えるので結構利点は多いと思います。

 

◇プライバシーポリシー

●個人情報の利用目的

当ブログでは、メールでのお問い合わせ、メールマガジンへの登録などの際に、名前(ハンドルネーム)、メールアドレス等の個人情報をご登録いただく場合がございます。

これらの個人情報は質問に対する回答や必要な情報を電子メールなどをでご連絡する場合に利用させていただくものであり、個人情報をご提供いただく際の目的以外では利用いたしません。

●個人情報の第三者への開示

当サイトでは、個人情報は適切に管理し、以下に該当する場合を除いて第三者に開示することはありません。

・本人のご了解がある場合
・法令等への協力のため、開示が必要となる場合

個人情報の開示、訂正、追加、削除、利用停止
ご本人からの個人データの開示、訂正、追加、削除、利用停止のご希望の場合には、ご本人であることを確認させていただいた上、速やかに対応させていただきます。

アクセス解析ツールについて

当サイトでは、Googleによるアクセス解析ツール「Googleアナリティクス」を利用しています。

このGoogleアナリティクスはトラフィックデータの収集のためにCookieを使用しています。このトラフィックデータは匿名で収集されており、個人を特定するものではありません。
この機能はCookieを無効にすることで収集を拒否することが出来ますので、お使いのブラウザの設定をご確認ください。

●免責事項

当サイトからリンクやバナーなどによって他のサイトに移動された場合、移動先サイトで提供される情報、サービス等について一切の責任を負いません。

当サイトのコンテンツ・情報につきまして、可能な限り正確な情報を掲載するよう努めておりますが、誤情報が入り込んだり、情報が古くなっていることもございます。

当サイトに掲載された内容によって生じた損害等の一切の責任を負いかねますのでご了承ください。

●プライバシーポリシーの変更について

当サイトは、個人情報に関して適用される日本の法令を遵守するとともに、本ポリシーの内容を適宜見直しその改善に努めます。

修正された最新のプライバシーポリシーは常に本ページにて開示されます。