Как реализовать подъём по ступенькам

Рейтинг: 0Ответов: 0Опубликовано: 19.04.2023

Я не могу понять как можно сделать нормальный подъём по ступенькам. Ступеньками могут быть абсолютно любой предмет. Я хочу, чтобы если расстояние между краем ступеньки и центром игрока меньше чем 0.8(3), то поднимался на неё. У него коллайдер в форме цилиндра с радиусом 0.5 (поэтому максимальное расстояние 0.8(3)). Проблема в том что либо игрока дёргает вверх на 0.5.

    private void FillGroundInfo()
    {
        _needSpan = false;
        // поиск ступенек
        var sphereHits = Physics.SphereCastAll(transform.parent.position + _sphereOffset, _sphereRadius, Vector3.down, _playerHeight + _maxStepSize, _layerMask, QueryTriggerInteraction.Ignore); 
        if (sphereHits.Length == 0) // проверка на пустой массив
        {
            _stairsOffset = Vector3.zero;
            _rigidBody.useGravity = true;
            return;
        }

        var sphereHit = sphereHits[0];
        foreach (var item in sphereHits)
        {
            // получаем элемент с максимальным значением y
            if (item.normal.y >= _minDot) // _minDot = 0.8
            {
                if (item.point.y > sphereHit.point.y)
                    sphereHit = item;
            }
        }

        if (!_lB.OnGround || Mathf.Round(_rigidBody.velocity.y) != 0)
        {
            _stairsOffset = Vector3.zero;
            _rigidBody.useGravity = true;
            return;
        }

        _needSpan = true;
        var playerPosition = _lB.transform.position; // _lB - класс игрока
        var playerPosition2D = new Vector2(playerPosition.x, playerPosition.z);
        var pointPosition2D = new Vector2(sphereHit.point.x, sphereHit.point.z);
        var distance = Vector2.Distance(playerPosition2D, pointPosition2D);
        var yOffset = sphereHit.point.y - _groundPosition.y; // _groundPosition - точка на которой стоит игрок
         
        // первая скобка - позиция игрока, если бы он не поднимался по ступеньке, вторая скобка - смещение
        _targetHeight = (_groundPosition.y + 1) + (Mathf.Clamp01(0.83333333f - distance) * yOffset);
    }

    private void Stairs()
    {
        _rigidBody.useGravity = !_needSpan;
        if (!_needSpan)
            return;

        _rigidBody.velocity = new Vector3(_rigidBody.velocity.x, 0, _rigidBody.velocity.z);
        _lB.transform.position = new Vector3(_lB.transform.position.x, _targetHeight, _lB.transform.position.z);
    }

Ответы

Ответов пока нет.