Rotating around an object

Hi guys,

I have my camera attached to an object and want to be able to move the camera around the object similar to a third-person controller. For that I created my own simple code.

First I attach the camera to the object (attachedUnit) and then set the initial distance and rotation:

transform.position = attachedUnit.transform.position - new Vector3(0f, 10f, 0f);
transform.rotation = Quaternion.Euler(new Vector3(-90f, 0f, 0f));	
transform.parent = attachedUnit.transform;

Next, here is my update function within the camera script that attempts to transpose the mouse movement into a rotation around the attached object:

void Update() {
    float rotationX = Input.GetAxis("Mouse X");
    float rotationY = -Input.GetAxis("Mouse Y");
    transform.RotateAround(attachedUnit.transform.position, Vector3.back, rotationX * 0.5f);
    transform.RotateAround(attachedUnit.transform.position, Vector3.left, rotationY * 0.5f);
}

When using this script in Unity, I get a load of crazy rotations around my object. The weird part is that each of the RotateAround functions on their own work perfectly. Only the combination of the two screws it up…

How can I fix this?

You should only use one RotateAround but it means figuring out the axis/angle to rotate around. In such cases I tend to punt and use two transforms, one for X the other for Y rotation, the X a child of Y

Ok, I got something that works, but it’s not very pretty…

			float rotationX = Input.GetAxis("Mouse X");
		    float rotationY = Input.GetAxis("Mouse Y");
			
			transform.RotateAround(attachedUnit.transform.position, Vector3.left, rotationY * 0.5f);
			
			if (holder == null)
				holder = new GameObject("CameraAttachment");
			
			holder.transform.position = new Vector3(attachedUnit.transform.position.x, attachedUnit.transform.position.y, transform.position.z);
			transform.LookAt(holder.transform.position, Vector3.back);
			
			transform.RotateAround(holder.transform.position, Vector3.back, rotationX * 0.5f);
			transform.LookAt(attachedUnit.transform.position, Vector3.back);