void UpdateEdgeInfo(ref CollisionInfo collisionInfo, Vector3 position, HitInfoFilter hitInfoFilter) { Vector3 center = characterActor.GetBottomCenter(position, characterActor.StepOffset); Vector3 castDirection = (collisionInfo.hitInfo.point - center).normalized; Vector3 castDisplacement = castDirection * CharacterConstants.EdgeRaysCastDistance; Vector3 upperHitPosition = center + characterActor.Up * CharacterConstants.EdgeRaysSeparation; Vector3 lowerHitPosition = center - characterActor.Up * CharacterConstants.EdgeRaysSeparation; HitInfo upperHitInfo; physicsComponent.Raycast( out upperHitInfo, upperHitPosition, castDisplacement, hitInfoFilter ); HitInfo lowerHitInfo; physicsComponent.Raycast( out lowerHitInfo, lowerHitPosition, castDisplacement, hitInfoFilter ); collisionInfo.edgeUpperNormal = upperHitInfo.normal; collisionInfo.edgeLowerNormal = lowerHitInfo.normal; collisionInfo.edgeUpperSlopeAngle = Vector3.Angle(collisionInfo.edgeUpperNormal, characterActor.Up); collisionInfo.edgeLowerSlopeAngle = Vector3.Angle(collisionInfo.edgeLowerNormal, characterActor.Up); collisionInfo.edgeAngle = Vector3.Angle(collisionInfo.edgeUpperNormal, collisionInfo.edgeLowerNormal); collisionInfo.isAnEdge = CustomUtilities.isBetween(collisionInfo.edgeAngle, CharacterConstants.MinEdgeAngle, CharacterConstants.MaxEdgeAngle, true); collisionInfo.isAStep = CustomUtilities.isBetween(collisionInfo.edgeAngle, CharacterConstants.MinStepAngle, CharacterConstants.MaxStepAngle, true); }