- Home /
MoveRotation stops working while player is moving
I started learning Unity not so long ago, and I wrote this third person camera controller script which works perfectly until I start moving the "player". The player in this case is just a simple cube with basic movements. This is my camera controls script:
using UnityEngine;
public class TargetedCameraController : MonoBehaviour
{
public GameObject target;
public Vector3 offset;
public float rotationSpeed;
public float movementSmoothness;
public float maxYRotation;
public float minYRotation;
public float maxCameraDistance;
public float zoomSmoothness;
public float cameraClippingMargin;
GameObject helper;
private void Start()
{
helper = gameObject.GetComponentInParent<Rigidbody>().gameObject;
allowPlayerInput = true;
}
private void Update()
{
PlayerInput();
CastRay();
CameraRotation();
}
private void FixedUpdate()
{
FollowTarget();
}
//PLAYER INPUT MANAGER
[HideInInspector] bool allowPlayerInput;
private float inputX;
private float inputY;
int PlayerInput()
{
if (allowPlayerInput)
{
inputX = Input.GetAxis("Mouse X");
inputY = Input.GetAxis("Mouse Y");
}
else
{
inputX = 0;
inputY = 0;
}
return 0;
}
//CAMERA ROTAION MANAGER
float rotY;
float rotX;
int CameraRotation()
{
//Calculate Vertical Rotation
rotY -= inputY * rotationSpeed;
rotY = Mathf.Clamp(rotY, minYRotation, maxYRotation);
//Calculate Horizontal Rotation
rotX += inputX * rotationSpeed;
if(rotX >= 360)
{
rotX = 0;
}
if(rotX <= -360)
{
rotX = 0;
}
//Set Rotation
helper.GetComponent<Rigidbody>().MoveRotation(Quaternion.Euler(rotY, rotX, 0));
return 0;
}
//CAMERA MOVEMENT MANAGER
Vector3 smoothPos;
Vector3 offsetPos;
int FollowTarget()
{
//Sets desired camera position, smooths follow and adds the custom offset
offsetPos = target.transform.forward * offset.z + target.transform.right * offset.x + target.transform.up * offset.y;
smoothPos = Vector3.Slerp(target.transform.position + offsetPos, helper.transform.position, movementSmoothness);
helper.transform.position = smoothPos;
//Set camera position
transform.position = helper.transform.position + helper.transform.forward * -hitDistance;
return 0;
}
//CAMERA PHYSICS MANAGER
private Ray cameraDistanceRay;
private float hitDistance;
int CastRay()
{
//Cast the ray
cameraDistanceRay = new Ray(helper.transform.position, transform.forward * (-hitDistance - cameraClippingMargin));
//Get hit distance
RaycastHit hit;
if(Physics.Raycast(cameraDistanceRay, out hit) && hit.distance < hitDistance + 1 && hit.point != null)
{
hitDistance = Mathf.Clamp(hit.distance, 0.5f, maxCameraDistance);
hitDistance = hitDistance - cameraClippingMargin;
}
else if (hitDistance != maxCameraDistance)
{
hitDistance = Mathf.Lerp(hitDistance, maxCameraDistance, zoomSmoothness);
}
return 0;
}
}
The "helper" is an empty object that I use to rotate and move the camera. The camera is moved away from the helper using the maxCameraDistance value and the Raycast hit distance. After some debugging I found that this is the line of code that gives me this problem:
helper.GetComponent<Rigidbody>().MoveRotation(Quaternion.Euler(rotY, rotX, 0));
because when I try to change it to something, it doesn't stop working when the cube is moving (but then I cant make a limit for Y rotation so I really want to use this)
Here's a gif of what's going on: https://gyazo.com/35d6e35e8f4fe013b4b67bcad8ef4fea