protected IEnumerator AttackAnimationCoroutine(Vector3 end, int speedFactor = 1) { isAttackingAnimation = true; inverseMoveTime = 1f / moveTime * speedFactor; if (RogueGeneric.GetNumFromVector(end - transform.position) % 2 != 0) { inverseMoveTime *= Mathf.Sqrt(2); } Vector3 startPosition = transform.position; float sqrRemainingDistance = (transform.position - end).sqrMagnitude; while (sqrRemainingDistance > float.Epsilon) { Vector3 newPosition = Vector3.MoveTowards(rb2D.position, end, inverseMoveTime * Time.deltaTime); rb2D.MovePosition(newPosition); sqrRemainingDistance = (transform.position - end).sqrMagnitude; yield return(null); } end = startPosition; sqrRemainingDistance = (transform.position - end).sqrMagnitude; while (sqrRemainingDistance > float.Epsilon) { Vector3 newPosition = Vector3.MoveTowards(rb2D.position, end, inverseMoveTime * Time.deltaTime); rb2D.MovePosition(newPosition); sqrRemainingDistance = (transform.position - end).sqrMagnitude; yield return(null); } isAttackingAnimation = false; }
//現在地から目的地(引数end)へ移動するためのメソッド protected IEnumerator SmoothMovement(Vector3 end) { isMoving = true; isMovingPre = true; inverseMoveTime = 1f / moveTime; if (RogueGeneric.GetNumFromVector(end - transform.position) % 2 != 0) { inverseMoveTime *= Mathf.Sqrt(2); } //現在地から目的地を引き、2点間の距離を求める(Vector3型) //sqrMagnitudeはベクトルを2乗したあと2点間の距離に変換する(float型) float sqrRemainingDistance = (transform.position - end).sqrMagnitude; //2点間の距離が0になった時、ループを抜ける //Epsilon : ほとんど0に近い数値を表す while (sqrRemainingDistance > float.Epsilon) { //現在地と移動先の間を1秒間にinverseMoveTime分だけ移動する場合の、 //1フレーム分の移動距離を算出する Vector3 newPosition = Vector3.MoveTowards(rb2D.position, end, inverseMoveTime * Time.deltaTime); //算出した移動距離分、移動する rb2D.MovePosition(newPosition); //現在地が目的地寄りになった結果、sqrRemainDistanceが小さくなる sqrRemainingDistance = (transform.position - end).sqrMagnitude; if (sqrRemainingDistance < 0.01) { isMovingPre = false; } //1フレーム待ってから、while文の先頭へ戻る yield return(null); } isMoving = false; }