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

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

【Unity】小ネタ:一定速度で目的地へ向かうMoveTowards

残暑

夏が終わらないのに夏休みが終わるのは理不尽な気がする学生気分の皆さんこんにちは。残暑だか猛暑だかもううんざりです。こちら九州ではほとんど雨が降ってないので気温が下がらず、もう絶対に体の一部が溶けていると思う。

 

等速運動

Unityでオブジェクトを目的の場所まで動かす場合、DOTween等のAPIを使ってTransformを制御する手法が殆だと思いますが、そうするとAPIの仕様上、オブジェクトの動作は時間指定(何秒後に目的地に到達する)による制御になります。
通常ならそれで何の問題もありませんが、例えば下の図のようなパネルを入れ替えるようなパズルゲームの場合、

入れ替えを行うパネル間の距離を考慮せずに同じ時間を指定してパネルの移動を行うと、画面上ではパネルの移動速度がバラバラになるので、ユーザ側から見れば違和感感じる動作となります。

なので、全ての入替動作で同じ速度としたい場合は入替を行うパネル間の距離を算出して、その距離と移動速度から移動に指定する時間を決める必要があるのですが・・・ちょっと面倒です。

そんな時はVector3.MoveTowardsを使うと、目的地までの距離にかかわらない同じ速度の動作を実現することができます。

 

Vector3.MoveTowards

MoveTowardsでは現在地から目的地に向かって指定した動作速度分移動した座標を取得できます。

Vector3.MoveTowards(現在の位置, 目的の位置, 動作速度);

ここでいう移動速度とは、この関数の呼び出し間隔毎に移動する最大距離、のことを表しているので、例えばここ(動作速度)に「2.0f」を指定して、このAPIを1秒間隔で呼び出せば2.0 /secの速度、2秒間隔で呼び出せば1.0 /sec、0.5秒間隔なら4.0 /secの速度での移動となります。
なので、Update等でこの関数を呼び出す場合は、ここ(動作速度)に「移動速度*Time.deltaTime」を指定することになります。

void Update()
{
  TargetObj.transform.position = Vector3.MoveTowards(TargetObj.transform.position, EndPos.position, MoveSpeed * Time.deltaTime);
}

そして、ここ(動作速度)に指定した値は「最低限の移動距離」も表しているので、「現在の位置」と「目的の位置」との距離が「動作速度」で指定した値より小さい場合は、移動せず「現在の位置」の座標が返されることになります。ようは、目的に達したら勝手に停まってくれる、という事です。

 

使用例

入れ替えパズルへこの処理を実装すると上の動画のようにパネル間の距離に関わらず同じ速度で動作し、目的に達したら止まる事が分かります。

 

今後について

特に言及する必要はないのかもしれませんが、一応お知らせを・・・

 

今まで当ブログではUntiyに関する使い方、ノウハウをネタに記事を書いてきましたが、ここ最近のAI利用の拡大によりこういった技術ネタの需要は少なくなったと感じています。
Unityに限らずゲーム開発に関する技術的な疑問は殆どの方がWebをググって調べるよりAIを使って調査・実装しているのではないでしょうか?

今後はUnityネタの割合を減らして、制作中のゲームの進捗報告が主な内容になるかと思います。

まぁ、こちらも需要はあまり無さそうですが、作品の宣伝を兼ねる意味はあるし。

 

◇プライバシーポリシー

●個人情報の利用目的

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

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

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

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

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

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

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

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

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

●免責事項

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

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

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

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

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

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