いつもお世話になっております。
rigidbodyを使用しないプレイヤーの挙動を制作しており、目的地に到達したときにMoveTowardsの移動を終了する処理で、Transform同士で比較するよりMathf.Approximatelyのほうが安定するっぽいのでそちらを使っていたのですが、それでも処理が安定しません。(Mathf.Approximatelyがtrueにならず再帰呼び出ししているコルーチンから抜け出せなくなっているっぽい)
目的地に到達したらという処理を安定させる方法があればご教授いただければ幸いです。
C#
/// <summary> /// ImageMove /// プレイヤーの画像を移動させる /// </summary> void ImageMove() { switch (playerAct) { case PlayerAct.Right: targetPos = transform.position; // 初期化 targetPos.x = transform.position.x + 0.2f; // 移動先の位置を取得 ImageMoving(targetPos.x, transform.position.x); // プレイヤーの画像を動かす break; case PlayerAct.Left: targetPos = transform.position; targetPos.x = transform.position.x - 0.2f; ImageMoving(targetPos.x, transform.position.x); break; case PlayerAct.Up: targetPos = transform.position; targetPos.y = transform.position.y + 0.2f; ImageMoving(targetPos.y, transform.position.y); break; case PlayerAct.Down: targetPos = transform.position; targetPos.y = transform.position.y - 0.2f; ImageMoving(targetPos.y, transform.position.y); break; } } /// <summary> /// ImageMoving /// 画像を移動させる /// </summary> /// <param name="target">移動先の座標</param> /// <param name="cuurent">現在地点</param> void ImageMoving(float target, float cuurent) { switch (playerAct) { case PlayerAct.Right: StartCoroutine(nameof(MoveProcess)); // MoveTowadsを用いた移動処理 break; case PlayerAct.Left: StartCoroutine(nameof(MoveProcess)); break; case PlayerAct.Up: StartCoroutine(nameof(MoveProcess)); break; case PlayerAct.Down: StartCoroutine(nameof(MoveProcess)); break; default : Debug.Log("error"); break; } } /// <summary> /// MoveProcess /// 移動の補間処理 /// </summary> /// <returns></returns> IEnumerator MoveProcess() { float dis = 0.01f * moveSpeed; // 補間の変数dis transform.position = Vector3.MoveTowards(transform.position, targetPos, dis); // 移動の補間 float targetX = (float)Math.Round(targetPos.x, 1, MidpointRounding.AwayFromZero); // 少数第1で切り捨て float targetY = (float)Math.Round(targetPos.y, 1, MidpointRounding.AwayFromZero); float crPosX = (float)Math.Round(transform.position.x, 1, MidpointRounding.AwayFromZero); float crPosY = (float)Math.Round(transform.position.y, 1, MidpointRounding.AwayFromZero); if (Mathf.Approximately(crPosX, targetX)) // 目的地に到達したとき { if (Mathf.Approximately(crPosY, targetY)) { dis = 0; // 一応初期化 refreshFlag = true; yield break; } } StartCoroutine(nameof(MoveProcess)); // コルーチンの再起呼び出し }
まだ回答がついていません
会員登録して回答してみよう