public Vector3 GetTargetFollowPosition(float deltaTime, float virtualCameraSphereRadius) { //get desired offset based on whether target is moving towards or away from camera. If we add more camera-target orientation states, //will need to do this a better way Vector3 desiredOffset; float followSpeedHorz; float followSpeedVert; float followSpeedDistance; if (stateController.GetOrientationState() == CameraTargetOrientationState.TowardsCamera && camParams.allowMoveTowardsCamera) { desiredOffset = camParams.desiredFrontOffset; followSpeedHorz = camParams.frontFollowSpeedOrientation; followSpeedVert = camParams.frontFollowSpeedHeight; followSpeedDistance = camParams.frontFollowSpeedDistance; } else //moving away from camera { desiredOffset = camParams.desiredOffset; followSpeedHorz = camParams.followSpeedOrientation; followSpeedVert = camParams.followSpeedHeight; followSpeedDistance = camParams.followSpeedDistance; } //get desired height offset based on follow height mode if (camParams.followHeightMode == FollowHeightMode.AboveGround) { desiredOffset.y = GetDesiredHeightAboveGroundOffset(virtualCameraSphereRadius); } //get desired position from offset Vector3 desiredPos = GetDesiredFollowPositionWorld(desiredOffset); //shorten follow distance if necessary desiredPos = occlusionAvoidance.ShortenFollowDistanceToAvoidRearOcclusion(desiredPos, virtualCameraSphereRadius); //increase follow speed if avoiding occlusion if (camParams.avoidFollowTargetOcclusion) { float occlusionSpeedIncrease = occlusionAvoidance.GetOcclusionFollowSpeedIncrease(); followSpeedHorz += occlusionSpeedIncrease; followSpeedVert += occlusionSpeedIncrease; } //interpolate between current and desired positions Vector3 newCamPos = locomotion.MoveCameraInterpolated(desiredPos, followSpeedHorz, followSpeedVert, deltaTime); //interpolate distance from target separately float desiredDistance = desiredOffset.magnitude; Vector3 newOffset = newCamPos - followTarget.transform.position; //convert new cam position back to a world space offset from follow target float newDistance = Lerps.Smootherstep(newOffset.magnitude, desiredDistance, followSpeedDistance * deltaTime); //interpolate between current offset distance and desired distance return(followTarget.transform.position + (newOffset.normalized * newDistance)); //scale normalised offset by new distance and convert back to world position }
// Update is called once per frame void Update() { headerText.text = "Camera: " + cam.name; positionText.text = "Position: " + cam.transform.position.ToString(); stateText.text = "State: " + stateController.GetCameraState().ToString() + ", " + stateController.GetOrientationState(); orbitText.text = "Orbit input: " + camInput.GetOrbitInput().ToString(); }