ゲームオブジェクトを位置 A から BVector3.MoveTowardsに x 秒以内に、コルーチン関数で移動したいと考えています。これを行う方法は知っていますが、両方の関数の動作が異なるため、Vector3.Lerp今回は で行うことをお勧めします。Vector3.MoveTowards
では、これVector3.Lerpは次のように行われます。
IEnumerator moveToX(Transform fromPosition, Vector3 toPosition, float duration)
{
float counter = 0;
//Get the current position of the object to be moved
Vector3 startPos = fromPosition.position;
while (counter < duration)
{
counter += Time.deltaTime;
fromPosition.position = Vector3.Lerp(startPos, toPosition, counter / duration);
yield return null;
}
}
で同じことをしようとしましたが、Vector3.MoveTowards正しく動作しません。問題は、移動が x 時間または期間の前に終了することです。また、スムーズに動かない。位置 B の最後ではなく、両方の位置の中間にジャンプします。
Vector3.MoveTowardsこれは、上記の問題で使用する関数です。
IEnumerator MoveTowards(Transform objectToMove, Vector3 toPosition, float duration)
{
float counter = 0;
while (counter < duration)
{
counter += Time.deltaTime;
Vector3 currentPos = objectToMove.position;
float time = Vector3.Distance(currentPos, toPosition) / duration;
objectToMove.position = Vector3.MoveTowards(currentPos, toPosition,
time);
Debug.Log(counter + " / " + duration);
yield return null;
}
}
Vector3.MoveTowardsx秒以内にコルーチン関数でゲームオブジェクトを位置AからBに移動するにはどうすればよいですか?
Vector3.Lerpそれは私が使いたいものではないので、提案しないでください。
編集:
交換する
float time = Vector3.Distance(currentPos, toPosition) / duration;
と
float time = Vector3.Distance(startPos, toPosition) / (duration * 60f);
動作しますが、フォーカスが Unity から別のアプリケーションに移動すると問題が発生します。動きが終わらない原因になります。タイマーを開始する前に、1 回ではなくフレームごとに計算する方が合理的です。
MatrixTai の回答により、両方の問題が解決されました。