Trying to Make a Smooth Camera Zoom While Changing Targets
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(); } }
Answer by IceMachineMG · Jun 06, 2017 at 10:03 PM
Nevermind. I figured it out with a distance ratio, which speeds up or slows down the target change based on player distance to the original camera target.
Your answer
![](https://koobas.hobune.stream/wayback/20220612123400im_/https://answers.unity.com/themes/thub/images/avi.jpg)
Follow this Question
Related Questions
Why doesn't my camera work?,Why does my mouse keep going up? 2 Answers
viewing on the Mouse Y axis not working. 0 Answers
getting Jittery movement on camera when player rotating and moving in same time 0 Answers
CineMachine Camera Movement is inverse 1 Answer
(Solveed) How to make object face same direction as its parent? 0 Answers