How to avoid jittering / stuttering when colliding with objects in 3D?
(Firstly, I want to note that I'm very new to unity and coding in general)
So, I've been making a first person controller that lets you move around with W.A.S.D and look around with the mouse. It works fine until I add objects. When my characterObject collides with an object; particularly a kinematic object, and then continues to move in the direcion of the object, it jitters and stutters into the object. In some cases I was even able to push myself through solid kinematic objects even though the object has a collider.
I'm not sure how to fix this, I just want my character to hit an object and then stop smoothly like hitting a wall in real life.
This is my code for movement:
public class CharacterController : MonoBehaviour {
public float speed = 10f;
private Rigidbody rb;
// Start is called before the first frame update
void Start()
{
Cursor.lockState = CursorLockMode.Locked;
rb = GetComponent<Rigidbody>();
}
// Update is called once per frame
void Update()
{
float translation = Input.GetAxis("Vertical") * speed;
float straffe = Input.GetAxis("Horizontal") * speed;
translation *= Time.deltaTime;
straffe *= Time.deltaTime;
transform.Translate(straffe, 0, translation);
if (Input.GetKeyDown("escape"))
{
Cursor.lockState = CursorLockMode.None;
}
}
}
And this is my code for the camera movement (mouse movement):
public class CamMouseLook : MonoBehaviour {
Vector2 mouseLook;
Vector2 smoothV;
public float sensitivity = 5f;
public float smoothing = 2f;
GameObject character;
// Start is called before the first frame update
void Start()
{
character = this.transform.parent.gameObject;
}
// Update is called once per frame
void Update()
{
var md = new Vector2(Input.GetAxisRaw("Mouse X"), Input.GetAxisRaw("Mouse Y"));
//md = Mouse Delta
md = Vector2.Scale(md, new Vector2(sensitivity * smoothing, sensitivity * smoothing));
//Multiplies the mouse movement with the sensitivity and smoothing variables (Applies them)
smoothV.x = Mathf.Lerp(smoothV.x, md.x, 1f / smoothing);
smoothV.y = Mathf.Lerp(smoothV.y, md.y, 1f / smoothing);
//Lerp is applied to smooth the movement of turning rather than snapping it into place
mouseLook += smoothV;
mouseLook.y = Mathf.Clamp(mouseLook.y, -90f, 90f);
transform.localRotation = Quaternion.AngleAxis(-mouseLook.y, Vector3.right);
character.transform.localRotation = Quaternion.AngleAxis(mouseLook.x, character.transform.up);
}
}
The movement script is attached to the characterObject which is just a capsule, and the camera script is attached to the camera which is a child of the characterObject, Thanks!
(I use C# + Unity)
Answer by Fabi23902894787 · Sep 08, 2020 at 12:50 PM
Hi, you have to change the Collision Detection under "Rigidbody" from Discrete to Continuous
Answer by streeetwalker · Sep 08, 2020 at 03:31 PM
@Erik111, if you are using a Rigidbody then do not ever modify the object's transform position or rotation. Use the Rigidbody physics engine API calls for all such manipulations.
The problem is you are counting on the physics engine to resolve collisions for you, and then you are overriding the results by trying to position your object through its transform. The physics engine knows nothing about that, and on the next FixedUpdate cycle there is a conflict between the two systems.
Your answer
Follow this Question
Related Questions
Player keeps spinning after collision 0 Answers
stutter when going next a cube 1 Answer
Make the Player unable to move to opposite direction 1 Answer
3D space movement: character stuck at edge in free space 0 Answers
Can't Jump While Wall Running 0 Answers