From 8be4e5073fcadb3919db36c3cbccdfae45cf242a Mon Sep 17 00:00:00 2001 From: wasdennnoch <leiter04@gmail.com> Date: Fri, 2 Apr 2021 22:34:16 +0200 Subject: [PATCH] Don't create new InsetEdges every frame --- Assets/Scripts/BaseCameraController.cs | 54 +++++++++++++++++++------- 1 file changed, 41 insertions(+), 13 deletions(-) diff --git a/Assets/Scripts/BaseCameraController.cs b/Assets/Scripts/BaseCameraController.cs index f1f9736..b92cb36 100644 --- a/Assets/Scripts/BaseCameraController.cs +++ b/Assets/Scripts/BaseCameraController.cs @@ -20,6 +20,7 @@ public class BaseCameraController : MonoBehaviour new BoxCollider2D collider; new Rigidbody2D rigidbody; + InsetCameraEdges mouseMovementEdges; Interpolator zoomInterpolator; Interpolator moveXInterpolator; Interpolator moveYInterpolator; @@ -29,12 +30,19 @@ public class BaseCameraController : MonoBehaviour get => camera.orthographicSize / maxZoom; } + public void PlayGlobalAudioClip(AudioClip clip, float volume = 1f) + { + audio.PlayOneShot(clip, volume); + } + void Awake() { camera = GetComponent<Camera>(); audio = GetComponent<AudioSource>(); collider = GetComponent<BoxCollider2D>(); rigidbody = GetComponent<Rigidbody2D>(); + + mouseMovementEdges = new InsetCameraEdges(camera); zoomInterpolator = new Interpolator(1 / zoomSpeed, camera.orthographicSize, camera.orthographicSize, minZoom, maxZoom); moveXInterpolator = new Interpolator(1 / moveSpeed); moveYInterpolator = new Interpolator(1 / moveSpeed); @@ -59,9 +67,9 @@ public class BaseCameraController : MonoBehaviour if (inputVector.magnitude == 0) { var mouseViewportPos = camera.ScreenToWorldPoint(Input.mousePosition); - var mouseEdges = new InsetEdges(camera, mouseEdgeDetectionBoxSize * zoomRatio); - mouseEdges.DrawDebug(); - inputVector = mouseEdges.GetOutOfBoundsDirection(mouseViewportPos); + mouseMovementEdges.RecalculateBounds(mouseEdgeDetectionBoxSize * zoomRatio); + mouseMovementEdges.DrawDebug(); + inputVector = mouseMovementEdges.GetOutOfBoundsDirection(mouseViewportPos); } moveXInterpolator.targetValue = inputVector.x; moveYInterpolator.targetValue = inputVector.y; @@ -88,29 +96,49 @@ public class BaseCameraController : MonoBehaviour void OnDrawGizmosSelected() { - if (camera == null) + if (camera == null || mouseMovementEdges == null) { camera = GetComponent<Camera>(); + mouseMovementEdges = new InsetCameraEdges(camera); } - var mouseEdges = new InsetEdges(camera, mouseEdgeDetectionBoxSize * zoomRatio); - mouseEdges.DrawGizmos(); + mouseMovementEdges.RecalculateBounds(mouseEdgeDetectionBoxSize * zoomRatio); + mouseMovementEdges.DrawGizmos(); } - public void PlayGlobalAudioClip(AudioClip clip, float volume = 1f) + private class InsetCameraEdges { - audio.PlayOneShot(clip, volume); - } + private Camera camera; + private Vector3 insetVector; - private class InsetEdges - { public Vector3 bottomLeft; public Vector3 topRight; private Vector3 bottomRight; private Vector3 topLeft; - public InsetEdges(Camera camera, float inset) + public InsetCameraEdges(Camera camera) : this(camera, 0) { } + + public InsetCameraEdges(Camera camera, float inset) : this(camera, inset, inset) { } + + public InsetCameraEdges(Camera camera, float insetX, float insetY) + { + this.camera = camera; + RecalculateBounds(insetX, insetY); + } + + public void RecalculateBounds(float newInset) + { + RecalculateBounds(newInset, newInset); + } + + public void RecalculateBounds(float newInsetX, float newInsetY) + { + insetVector = new Vector3(newInsetX, newInsetY); + RecalculateBounds(); + } + + public void RecalculateBounds() { - var insetVector = new Vector3(inset, inset); + // TODO this would be way better if it would just use viewport positions bottomLeft = camera.ViewportToWorldPoint(Vector3.zero) + insetVector; topRight = camera.ViewportToWorldPoint(Vector3.one) - insetVector; bottomLeft.z = 0; -- GitLab