- Home /
Question by
Vekosava · Dec 22, 2016 at 07:31 PM ·
fixedupdatecamera movementdeltatimestutterlateupdate
Camera Stutter on RayCast Collision Problem
Hey everyone!
I've managed to make my third person camera react on collision using LineCast/RayCasting. But when I'm in collision, when camera zooms at player, it start to stutter. Weird behaviour. I've tried to change execution order by placing raycasts in Update instead of LateUpdate, or using FixedUpdate, fixedDeltaTime, smoothDeltaTime, but it seems only to make stuttering worse of to make player stutter but camera fine.
Here is Camera Script:
using UnityEngine;
public class CameraTest : MonoBehaviour {
public Transform target;
private Transform playerCamera;
public float distance;
public float orbitSpeed;
public float Yspeed;
public float maxY;
public float minY;
public float rotationDamp = 8.0f;
public float collisionDamp = 1.0f;
private float curX;
private float curY;
private bool pressing;
private Vector3 destination;
private RaycastHit hit;
private void Start () {
playerCamera = transform;
}
private void Update () {
if (Input.GetMouseButtonDown(0) || Input.GetMouseButtonDown(1)) {
pressing = true;
}
if (Input.GetMouseButtonUp(0) || Input.GetMouseButtonUp(1)) {
pressing = false;
}
if (pressing) {
curX += Input.GetAxis ("Mouse X") * orbitSpeed * Time.deltaTime;
curY += Input.GetAxis ("Mouse Y") * -Yspeed * Time.deltaTime;
curY = Mathf.Clamp (curY, minY, maxY);
}
}
private void LateUpdate () {
Vector3 dir = new Vector3 (0, 0, -distance);
Quaternion rotation = Quaternion.Euler (curY, curX, 0);
destination = target.position + rotation * dir;
if (Physics.Linecast(target.position, destination, out hit)) {
if (hit.collider.CompareTag("Terrain")) {
playerCamera.position = Vector3.Lerp (playerCamera.position, hit.point + hit.normal * 5f, collisionDamp * Time.deltaTime);
}
}
playerCamera.position = Vector3.Lerp (playerCamera.position, destination, rotationDamp * Time.deltaTime);
playerCamera.LookAt (target);
}
}
And here is Player Script:
using UnityEngine;
public class PlayerTest : MonoBehaviour {
public float speed;
public float rotationSpeed;
private void Update () {
Move ();
}
private void Move () {
float horizontal = Input.GetAxisRaw ("Vertical") * speed * Time.deltaTime;
float vertical = Input.GetAxisRaw ("Horizontal") * rotationSpeed * Time.deltaTime;
transform.Translate (0, 0, horizontal);
transform.Rotate (0, vertical, 0);
}
}
Any ideas? Thanks!
Comment