Как реализовать подъём по ступенькам
Я не могу понять как можно сделать нормальный подъём по ступенькам. Ступеньками могут быть абсолютно любой предмет. Я хочу, чтобы если расстояние между краем ступеньки и центром игрока меньше чем 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);
}
Источник: Stack Overflow на русском