using UnityEngine; using UnityEngine.Serialization; [ExecuteInEditMode] public class Dimensions : MonoBehaviour { public static Dimensions Singleton; public bool isUpdating; [FormerlySerializedAs("panelHeightPixels")] [Tooltip("Player panels height")] public float panelHeightPixelsMinimum; [Tooltip("Size in Unity units")] public Vector2 playGroundSize; [Tooltip("Height of the empty space between board and death zone")] public float emptySpaceHeight; public Camera mainCamera; public EdgeCollider2D topC, bottomC, leftC, rightC; public SpriteRenderer playGround; public SpriteRenderer playerPanelTop; public SpriteRenderer playerPanelBottom; public SpriteRenderer background; private LineRenderer topL, bottomL; public Vector2 PlaySize { get; private set; } public Vector2 PlaySizeBoards { get; private set; } public float PanelHeightPixels { get; private set; } private void Awake() { Singleton = this; GetComponents(); SetDimensions(); if (Application.isPlaying) isUpdating = false; } private void Update() { if (!isUpdating) return; SetDimensions(); } private void GetComponents() { topL = topC.GetComponent(); bottomL = bottomC.GetComponent(); } private void SetDimensions() { var heightByPanels = 1 / (1 - 2 * panelHeightPixelsMinimum / mainCamera.pixelHeight) * playGroundSize.y; var heightByPlayground = playGroundSize.x / mainCamera.aspect; var height = Mathf.Max(heightByPanels, heightByPlayground); var width = mainCamera.aspect * height; var panelHeight = (height - playGroundSize.y) / 2; mainCamera.orthographicSize = height / 2; var top = playGroundSize.y / 2; var right = playGroundSize.x / 2; PanelHeightPixels = panelHeight / height * mainCamera.pixelHeight; PlaySize = playGroundSize; PlaySizeBoards = playGroundSize - new Vector2(0, emptySpaceHeight * 2); Vector2 v1 = new Vector3(-right, 0); Vector2 v2 = new Vector3(right, 0); Vector2 v3 = new Vector3(0, top); Vector2 v4 = new Vector3(0, -top); topC.transform.position = new Vector2(0, top); bottomC.transform.position = new Vector2(0, -top); leftC.transform.position = new Vector2(-right, 0); rightC.transform.position = new Vector2(right, 0); topC.points = new[] {v1, v2}; bottomC.points = new[] {v1, v2}; leftC.points = new[] {v3, v4}; rightC.points = new[] {v3, v4}; playGround.transform.rotation = Quaternion.Euler(0, 0, 90); playGround.size = new Vector2(playGroundSize.y, playGroundSize.x); const float lineWidth = 0.5f; var offset = Vector3.up * lineWidth / 2; topL.positionCount = bottomL.positionCount = 2; var v12 = new[] {(Vector3) v1 - offset, (Vector3) v2 - offset}; topL.SetPositions(v12); v12 = new[] {(Vector3) v1 + offset, (Vector3) v2 + offset}; bottomL.SetPositions(v12); playerPanelTop.transform.position = new Vector2(0, (height + PlaySize.y) / 4); playerPanelBottom.transform.position = new Vector2(0, -(height + PlaySize.y) / 4); playerPanelTop.size = playerPanelBottom.size = new Vector2(width, panelHeight); background.size = new Vector2(width, playGroundSize.y); } }