Pristo
March 20, 2016, 4:22pm
1
Hey guys. I have been trying to figure out how to do this for around 45 minutes. I am trying to get the camera to follow a target while allowing for the use of the Unity Engine function rotatearound().
This is what i have got at the moment for moving the camera to rotate around:
if (Input.GetKey(KeyCode.A))
{
degrees += 60f * Time.deltaTime;
transform.RotateAround(target.position, Vector3.up, degrees);
}
That does the rotation correctly. The problem i am having is when i use the below code to follow the target it will negate the rotatearound because i am setting the position to be changed. What can i use to let the camera do both of these things?
Vector3 targetCamPos = target.position + offset;
transform.position = Vector3.Lerp(transform.position, targetCamPos, smoothing * Time.deltaTime);
Thanks
Pristo
March 26, 2016, 12:44am
2
So i think i would need to answer my own question. I managed to solve it with clamping and zooming.
public Transform cameraTarget;
private float x = 0.0f;
private float y = 0.0f;
private int HorizontalSpeed = 5;
private int VerticalSpeed = 2;
public float MaxViewDistance = 25f;
public float MinViewDistance = 10f;
public int ZoomRate = 20;
private float CamDistance = 3f;
private float DesiredDistance = 0f;
private float CorrectedDistance = 0f;
// Use this for initialization
void Start()
{
Vector3 angles = transform.eulerAngles;
x = angles.x;
y = angles.y;
}
void LateUpdate()
{
x += Input.GetAxis("Horizontal") * HorizontalSpeed;
y += Input.GetAxis("Vertical") * VerticalSpeed;
y = ClampAngle(y, 20, 80);
Quaternion rotation = Quaternion.Euler(y, x, 0);
DesiredDistance -= Input.GetAxis("Mouse ScrollWheel") * Time.deltaTime * ZoomRate * Mathf.Abs(DesiredDistance);
DesiredDistance = Mathf.Clamp(DesiredDistance, MinViewDistance, MaxViewDistance);
CorrectedDistance = DesiredDistance;
Vector3 position = cameraTarget.position - (rotation * Vector3.forward * DesiredDistance);
transform.rotation = rotation;
transform.position = position;
}
private static float ClampAngle(float angle, float min, float max)
{
if (angle < -360)
{
angle += 360;
}
if (angle > 360)
{
angle -= 360;
}
return Mathf.Clamp(angle, min, max);
}