Hey,
I cannot get my camera to smoothly switch targets while zooming in or out simultaneously. The camera always zooms a set amount. Though that distance/time is constant, my change target code distance/time is variable because it rotates the camera between an idle object and my player. When my player is a certain distance away, all goes well, but when he moves further or closer, it doesn’t look so great. Is there some sort of ratio I can use to always make my two functions run for the same exact amount of time/frames/whatever? (I.E. the camera reaches the new zoom location and the new target at the same exact time every time the function is called?).
private void ChangeTarget(Transform tgt)
{
changingTarget = true;
activeTarget = tgt;
Vector3 dir = new Vector3(0.0f, 0.0f, -dist);
Quaternion rotation = Quaternion.Euler(currentX, currentY, 0.0f);
float distToTarget = Vector3.Distance(activeTarget.position + rotation * dir, camTransform.position);
Debug.Log(distToTarget);
camTransform.position = Vector3.MoveTowards(camTransform.position, activeTarget.position + rotation * dir, 20.0f * Time.deltaTime);
if (camTransform.position == activeTarget.position + rotation * dir)
{
camTransform.LookAt(activeTarget.position);
changingTarget = false;
}
}
//Zoom the camera in
private void ZoomIn()
{
//activeTarget = target2;
if (!zoomingOut)
{
float targetZoom;
if (cam.orthographicSize > 8.0f)
{
targetZoom = 8.0f;
}
else
{
targetZoom = 4.0f;
}
if (cam.orthographicSize > targetZoom)
{
zoomingIn = true;
cam.orthographicSize -= 20.0f * Time.deltaTime;
if (targetZoom == 4.0f)
{
ChangeTarget(playerTransform);
}
StartCoroutine(ZoomPause(0.0f));
}
if (cam.orthographicSize <= targetZoom)
{
zoomingIn = false;
cam.orthographicSize = targetZoom;
}
}
}
//Zoom the camera out
private void ZoomOut()
{
float targetZoom;
if (cam.orthographicSize < 8.0f)
{
targetZoom = 8.0f;
}
else
{
targetZoom = 12.0f;
}
if (!zoomingIn)
{
if (cam.orthographicSize < targetZoom)
{
zoomingOut = true;
cam.orthographicSize += 20.0f * Time.deltaTime;
if(targetZoom == 8.0f)
{
ChangeTarget(targetTransform);
}
StartCoroutine(ZoomPause(0.0f));
}
if (cam.orthographicSize >= targetZoom)
{
zoomingOut = false;
cam.orthographicSize = targetZoom;
}
}
}
IEnumerator ZoomPause(float pauseTime)
{
float p = pauseTime;
yield return new WaitForSeconds(p);
if (zoomingIn)
{
ZoomIn();
}
else if(zoomingOut)
{
ZoomOut();
}
}