I’ve been struggling with this issue for days. Please, someone help.
I’ve got a sphere whose movement I need to restrict when rolling up steep slopes. I’ve been able to make this work, sorta, but the last bit of fine-tuning is giving me trouble. Can anyone help?
I’m currently using a standard Physics.Raycast to check for when I’m on a steep slope. The follow code is attached to the sphere I need to restrict:
public class BallEntity : MonoBehaviour
{
//slope movement https://www.youtube.com/watch?v=GI5LAbP5slE
[Header("Slope Control")]
[SerializeField] float _groundRayDistance;
[SerializeField] private RaycastHit _slopeHit;
[SerializeField] float _slopeLimit;
public bool OnSteepSlope()
{
if (CheckIsGrounded() == false) return false;
float scRadius = GetComponent<SphereCollider>().radius;
if (Physics.Raycast(gameObject.transform.position, Vector3.down, out _slopeHit, scRadius + _groundRayDistance))
{
float _slopeAngle = Vector3.Angle(_slopeHit.normal, Vector3.up);
if (_slopeAngle > _slopeLimit)
{
return true;
}
}
return false;
}
}
This works (well enough), but as expected, given the spherical shape of the, well, the sphere and the position of the raycast (center of the sphere), my method allows the sphere to move up the slope a bit before the steep slope is detected. See the image below, which uses OnDrawGizmos() to show the position of the raycast:
attachFull1012855
I tried:
- Using Vector3.forward along with the sphere’s radius to place the origin of the RayCast at the front of the sphere. I got close with this method, but I couldn’t get it to work.
- Using a SphereCast instead of a standard RayCast. I couldn’t get this to work.
- Using a BoxCast instead of a standard RayCast. I couldn’t get this to work either.
Is one of the three methods above the best way to solve this issue? If so, I suppose I might be doing something wrong. Or, is there a simpler method that I haven’t considered?
Thank you so much for all your help!