Проблемы с движением игрока с использованием лучей в Unity2d - PullRequest
0 голосов
/ 13 ноября 2018

Я создаю 2D-платформер в Unity и столкнулся с проблемой со скриптом движения игрока.Дело в том, что персонаж никогда не бывает полностью на земле, в инспекторе его скорость у всегда изменяется с 0 на 0,3, а затем обратно на 0 и так для бесконечного цикла.

Возможно, это как-то связано сэта строка

position.y = hitRay.collider.bounds.center.y + hitRay.collider.bounds.size.y / 2 + 0.0801f;

еслиЯ поставил его на 0,08f, (мои игроки y размер 0,16f), мой игрок просто падает сквозь землю.

Если кто-то заметит ошибку и будет любезен помочь, я был бы очень благодарен.

void Fall()
{
    velocity.y = 0;

    playerState = PlayerState.jumping;

    grounded = false;

    bounce = false;
}

void UpdatePlayerPosition()
{
    Vector3 position = transform.localPosition;
    Vector3 scale = transform.localScale;

    if (walk)
    {
        if (walk_left)
        {
            position.x -= velocity.x * Time.deltaTime;

            scale.x = -1;
        }

        if (walk_right)
        {
            position.x += velocity.x * Time.deltaTime;

            scale.x = 1;
        }

        position = CheckWallRays(position, scale.x);
    }

    if (jump && playerState != PlayerState.jumping)
    {
        playerState = PlayerState.jumping;

        velocity = new Vector2(velocity.x, jumpVelocity);
    }

    if (playerState == PlayerState.jumping)
    {
        position.y += velocity.y * Time.deltaTime;
        velocity.y -= gravity * Time.deltaTime;
    }

    if (bounce && playerState != PlayerState.bouncing)
    {
        playerState = PlayerState.bouncing;

        velocity = new Vector2(velocity.x, bounceVelocity);
    }

    if (playerState == PlayerState.bouncing)
    {
        position.y += velocity.y * Time.deltaTime;

        velocity.y -= gravity * Time.deltaTime;
    }

    if (velocity.y <= 0)
    {
        position = CheckGroundRays(position);
    }

    if (velocity.y >= 0)
    {
        position = CheckCeilingRays(position);
    }

    transform.localPosition = position;
    transform.localScale = scale;
}

 Vector3 CheckGroundRays(Vector3 position)
{
    Vector2 left = new Vector2(position.x - 0.065f, position.y - 0.08f);
    Vector2 middle = new Vector2(position.x, position.y - 0.08f);
    Vector2 right = new Vector2(position.x + 0.065f, position.y - 0.08f);

    Debug.DrawRay(left, Vector2.down, Color.green);
    Debug.DrawRay(middle, Vector2.down);
    Debug.DrawRay(right, Vector2.down);

    RaycastHit2D groundLeft = Physics2D.Raycast(left, Vector2.down, velocity.y * Time.deltaTime, floorMask);
    RaycastHit2D groundMiddle = Physics2D.Raycast(middle, Vector2.down, velocity.y * Time.deltaTime, floorMask);
    RaycastHit2D groundRight = Physics2D.Raycast(right, Vector2.down, velocity.y * Time.deltaTime, floorMask);

    if (groundLeft.collider != null || groundMiddle.collider != null || groundRight.collider != null)
    {
        RaycastHit2D hitRay = groundLeft;

        if (groundLeft)
        {
            hitRay = groundLeft;
        }
        else if (groundMiddle)
        {
            hitRay = groundMiddle;
        }
        else if (groundRight)
        {
            hitRay = groundRight;
        }

        if (hitRay.collider.tag == "Enemy")
        {
            hitRay.collider.GetComponent<EnemyAI>().Crush();

            this.GetComponent<PlayerScore>().score += 100;

            bounce = true;
        }

        playerState = PlayerState.idle;

        grounded = true;

        velocity.y = 0;

        position.y = hitRay.collider.bounds.center.y + hitRay.collider.bounds.size.y / 2 + 0.0801f;
    }
    else if (playerState != PlayerState.jumping)
    {
        Fall();
    }

    return position;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...