- Home /
Help getting sliding / surfing mechanics with rigidbodies.
I've had a hard time finding decent up to date answers on how to implement this into unity. I am looking to get something similar to the sand-surfing of Journey using physics, where the player can quickly descend any snow covered slope while still retaining some control of their slide direction. A large part of what I want to accomplish is having the player dynamically fight against resisting forces such as deep snow and slide freely down steep slopes.
So far I don't have much beyond movement code, all the methods I've attempted haven't worked out but I at least have a raycast that can check for the slope angle. My movement code uses Rigidbody.Moveposition at the moment but if AddForce is more apt for what I'm trying to do I'm up for changing it. I understand this can be a complex issue so if you'd rather link me a tutorial that'd be great.
(Code has been cut down slightly to avoid unnecessary fluff, though I included parts of the movement code for context. - I'm not really a coder so excuse the potential bloat)
public class Player : MonoBehaviour
{
// (My Variables)
// Slope sliding values
public Vector3 HitNormal;
public float groundAngle;
// (My Object References)
void Awake ()
{
// (My initializations)
}
void Update()
{
// (Code calling void functions below)
}
// Movement properties
void Move()
{
// (My inputs and adjusting movement speed values)
// Calculate move direction
moveDirection = Vector3.zero;
moveDirection = (transform.forward * playerInput.Vertical) + (transform.right * playerInput.Horizontal);
moveDirection = moveDirection.normalized * moveSpeed;
// (My code turning player based on camera view)
//JUMP
// Check for ground collision
Vector3 down = transform.TransformDirection(Vector3.down);
RaycastHit hit;
if (Physics.Raycast(transform.position, down, 1.5f) && !HeadHit)
IsGrounded = true;
else
IsGrounded = false;
**// Slope detection**
if (Physics.Raycast(transform.position, down, out hit, 1.5f))
HitNormal = hit.normal;
groundAngle = Vector3.Angle(HitNormal, Vector3.up);
// (My code that also checks for overhead collision)
// Jump function
if (playerInput.Jump && IsGrounded)
playerRB.AddForce(Vector3.up * Mathf.Sqrt(jumpHeight * -2f * Physics.gravity.y), ForceMode.VelocityChange);
}
private void FixedUpdate()
{
// Movement code
playerRB.MovePosition(playerRB.position + moveDirection * speedModifier * Time.deltaTime);
}
Your answer
![](https://koobas.hobune.stream/wayback/20220612191137im_/https://answers.unity.com/themes/thub/images/avi.jpg)
Follow this Question
Related Questions
Unity 5 - Sliding Rigidbodies with maximum friction 2 Answers
Slope limiting with Rigidbody 0 Answers
Sliding down a slope with a character controller 1 Answer
Rigidbody gain speed falling on slope 0 Answers
Stop character sliding? 1 Answer