private void moveHorizontally( ref Vector3 deltaMovement )
{
var isGoingRight = deltaMovement.x > 0;
var rayDistance = Mathf.Abs( deltaMovement.x ) + _skinWidth;
var rayDirection = isGoingRight ? Vector2.right : -Vector2.right;
var initialRayOrigin = isGoingRight ? _raycastOrigins.bottomRight : _raycastOrigins.bottomLeft;
for( var i = 0; i < totalHorizontalRays; i++ )
{
var ray = new Vector2( initialRayOrigin.x, initialRayOrigin.y + i * _verticalDistanceBetweenRays );
DrawRay( ray, rayDirection * rayDistance, Color.red );
// if we are grounded we will include oneWayPlatforms only on the first ray (the bottom one). this will allow us to
// walk up sloped oneWayPlatforms
if( i == 0 && collisionState.wasGroundedLastFrame )
_raycastHit = Physics2D.Raycast( ray, rayDirection, rayDistance, platformMask );
else
_raycastHit = Physics2D.Raycast( ray, rayDirection, rayDistance, platformMask & ~oneWayPlatformMask );
if( _raycastHit )
{
// the bottom ray can hit slopes but no other ray can so we have special handling for those cases
if( i == 0 && handleHorizontalSlope( ref deltaMovement, Vector2.Angle( _raycastHit.normal, Vector2.up ) ) )
{
_raycastHitsThisFrame.Add( _raycastHit );
break;
}
// set our new deltaMovement and recalculate the rayDistance taking it into account
deltaMovement.x = _raycastHit.point.x - ray.x;
rayDistance = Mathf.Abs( deltaMovement.x );
// remember to remove the skinWidth from our deltaMovement
if( isGoingRight )
{
deltaMovement.x -= _skinWidth;
collisionState.right = true;
}
else
{
deltaMovement.x += _skinWidth;
collisionState.left = true;
}
_raycastHitsThisFrame.Add( _raycastHit );
// we add a small fudge factor for the float operations here. if our rayDistance is smaller
// than the width + fudge bail out because we have a direct impact
if( rayDistance < _skinWidth + kSkinWidthFloatFudgeFactor )
break;
}
}
}