
残暑
夏が終わらないのに夏休みが終わるのは理不尽な気がする学生気分の皆さんこんにちは。残暑だか猛暑だかもううんざりです。こちら九州ではほとんど雨が降ってないので気温が下がらず、もう絶対に体の一部が溶けていると思う。
等速運動
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ネタの割合を減らして、制作中のゲームの進捗報告が主な内容になるかと思います。
まぁ、こちらも需要はあまり無さそうですが、作品の宣伝を兼ねる意味はあるし。