Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /// <summary>
- /// we have to use a bit of trickery in this one. The rays must be cast from a small distance inside of our
- /// collider (skinWidth) to avoid zero distance rays which will get the wrong normal. Because of this small offset
- /// we have to increase the ray distance skinWidth then remember to remove skinWidth from deltaMovement before
- /// actually moving the player
- /// </summary>
- 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;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement