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
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