diff --git a/Assets/Fungus/Scripts/CameraController.cs b/Assets/Fungus/Scripts/CameraController.cs index 04460e3d..3e928fb2 100644 --- a/Assets/Fungus/Scripts/CameraController.cs +++ b/Assets/Fungus/Scripts/CameraController.cs @@ -9,14 +9,8 @@ namespace Fungus // Supports several types of camera transition including snap, pan & fade. public class CameraController : MonoBehaviour { - Action onArriveAction; - - float moveDuration; - float moveTimer; - float startSize; - float endSize; - Vector3 startPos; - Vector3 endPos; + // Fixed Z coordinate of camera + public float cameraZ = - 10f; Camera mainCamera; @@ -34,8 +28,6 @@ namespace Fungus Debug.LogError("Failed to find camera component"); return; } - - Reset(); } public Texture2D fadeTexture; @@ -102,16 +94,18 @@ namespace Fungus fadeAction(); } } - - void Reset() + + // Position camera so sprite is centered and fills the screen + public void CenterOnSprite(SpriteRenderer spriteRenderer) { - moveDuration = 0; - moveTimer = 0; - startSize = 0; - endSize = 0; - startPos = Vector3.zero; - endPos = Vector3.zero; - onArriveAction = null; + Sprite sprite = spriteRenderer.sprite; + Vector3 extents = sprite.bounds.extents; + float localScaleY = spriteRenderer.transform.localScale.y; + mainCamera.orthographicSize = extents.y * localScaleY; + + Vector3 pos = spriteRenderer.transform.position; + mainCamera.transform.position = new Vector3(pos.x, pos.y, 0); + SetCameraZ(); } public void SnapToView(View view) @@ -121,8 +115,6 @@ namespace Fungus public void PanToView(View view, float duration, Action arriveAction) { - Reset(); - if (duration == 0f) { // Move immediately @@ -136,64 +128,46 @@ namespace Fungus } else { - moveDuration = duration; - onArriveAction = arriveAction; - moveTimer = 0; - startSize = mainCamera.orthographicSize; - endSize = view.viewSize; - startPos = mainCamera.transform.position; - endPos = view.transform.position; + StartCoroutine(PanInternal(view, duration, arriveAction)); } } - // Position camera so sprite is centered and fills the screen - public void CenterOnSprite(SpriteRenderer spriteRenderer) - { - Sprite sprite = spriteRenderer.sprite; - Vector3 extents = sprite.bounds.extents; - float localScaleY = spriteRenderer.transform.localScale.y; - mainCamera.orthographicSize = extents.y * localScaleY; - - Vector3 pos = spriteRenderer.transform.position; - mainCamera.transform.position = new Vector3(pos.x, pos.y, 0); - SetCameraZ(); - } - - void Update () + IEnumerator PanInternal(View view, float duration, Action arriveAction) { - if (moveDuration == 0f) - { - return; - } - - moveTimer += Time.deltaTime; + float timer = 0; + float startSize = mainCamera.orthographicSize; + float endSize = view.viewSize; + Vector3 startPos = mainCamera.transform.position; + Vector3 endPos = view.transform.position; bool arrived = false; - if (moveTimer > moveDuration) + while (!arrived) { - moveTimer = moveDuration; - arrived = true; - } - - float t = moveTimer / moveDuration; + timer += Time.deltaTime; + if (timer > duration) + { + arrived = true; + timer = duration; + } - mainCamera.orthographicSize = Mathf.Lerp(startSize, endSize, Mathf.SmoothStep(0f, 1f, t)); - mainCamera.transform.position = Vector3.Lerp(startPos, endPos, Mathf.SmoothStep(0f, 1f, t)); - SetCameraZ(); + float t = timer / duration; + mainCamera.orthographicSize = Mathf.Lerp(startSize, endSize, Mathf.SmoothStep(0f, 1f, t)); + mainCamera.transform.position = Vector3.Lerp(startPos, endPos, Mathf.SmoothStep(0f, 1f, t)); + SetCameraZ(); - if (arrived) - { - if (onArriveAction != null) + if (arrived && + arriveAction != null) { - onArriveAction(); + arriveAction(); } - Reset(); + + yield return null; } } void SetCameraZ() { - mainCamera.transform.position = new Vector3(mainCamera.transform.position.x, mainCamera.transform.position.y, -10f); + mainCamera.transform.position = new Vector3(mainCamera.transform.position.x, mainCamera.transform.position.y, cameraZ); } } }