Exemple #1
0
    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;
    }
Exemple #2
0
    //現在地から目的地(引数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;
    }