Example #1
0
    public void parabolicMovement(Vector3 startPosition, Vector3 endPosition, float height, float speed)
    {
        float x0    = startPosition.x;
        float x1    = endPosition.x;
        float dist  = x1 - x0;
        float nextX = Mathf.MoveTowards(transform.position.x, x1, _moveSpeed * Time.deltaTime);

        if (Mathf.Approximately(nextX, x1))
        {
            transform.position = _endPosition;
            _currentState      = BladerState.Follow;
            return;
        }
        float   baseY   = Mathf.Lerp(startPosition.y, endPosition.y, (nextX - x0) / dist);
        float   arc     = height * (nextX - x0) * (nextX - x1) / (-0.25f * dist * dist);
        Vector3 nextPos = new Vector3(nextX, baseY + arc, startPosition.z);

        transform.position = nextPos;
    }
Example #2
0
    private void stateMachine()
    {
        switch (_currentState)
        {
        case BladerState.Follow:
        {
            if (MegamanActor.instance.transform.position.x > transform.position.x && !isMegamanClose())
            {
                _body.velocity = Vector2.right * _moveSpeed;
            }
            else if (MegamanActor.instance.transform.position.x < transform.position.x && !isMegamanClose())
            {
                _body.velocity = Vector2.left * _moveSpeed;
            }
            else if (isMegamanClose())
            {
                _body.velocity    = Vector2.zero;
                _startPosition    = transform.position;
                _megamanYPosition = MegamanActor.instance.transform.position.y;
                float distToMegaman = Mathf.Abs(_startPosition.x - MegamanActor.instance.transform.position.x);
                float moveDist      = Mathf.Max(2 * distToMegaman, 5f);
                if (transform.position.x < MegamanActor.instance.transform.position.x)
                {
                    _endPosition = transform.position + moveDist * Vector3.right;
                }
                else if (transform.position.x > MegamanActor.instance.transform.position.x)
                {
                    _endPosition = transform.position + moveDist * Vector3.left;
                }
                _currentState = BladerState.Attack;
            }
            break;
        }

        case BladerState.Attack:
        {
            parabolicMovement(_startPosition, _endPosition, _megamanYPosition - _startPosition.y, _moveSpeed);
            break;
        }
        }
    }