using System.Collections; using System.Collections.Generic; using UltraCombos.Utility.Attributes; using UnityEngine; public enum Area { LeftWall, RightWall, TopWall, Floor } public class FrozenScreenToWorldSpace : MonoBehaviour { public static FrozenScreenToWorldSpace Instance { get { return instacnce; } } private static FrozenScreenToWorldSpace instacnce; public float width = 8; public float depth = 5; public float height = 3; public float blackLength = 0.89f; public float PixelsByMeter = 360; public float finalPixelsByMeter = 90; [Header("Debug")] [SerializeField, ReadOnly] Rect LeftWall; [SerializeField, ReadOnly] Rect TopWall; [SerializeField, ReadOnly] Rect RightWall; [SerializeField, ReadOnly] Rect Floor; Dictionary RenderTextureROIList = new Dictionary(); private void Awake() { instacnce = this; InitailROISetting(); } void InitailROISetting() { var totalWidth = height * 2 + width; var totalHeight = height + depth + blackLength; var nWidth = width / totalWidth;//normalized var nWidth2 = height / totalWidth; var nHeight = height / totalHeight; var nHeight2 = depth / totalHeight; TopWall = new Rect(nWidth2, 0, nWidth, nHeight); LeftWall = new Rect(0, nHeight, nWidth2, nHeight2); Floor = new Rect(nWidth2, nHeight, nWidth, nHeight2); RightWall = new Rect(nWidth + nWidth2, nHeight, nWidth2, nHeight2); RenderTextureROIList = new Dictionary() { [Area.LeftWall] = LeftWall, [Area.RightWall] = RightWall, [Area.TopWall] = TopWall, [Area.Floor] = Floor, }; } // public Vector2 GetFinalScreenPos(Area area, Vector2 wallROI) // { // if (!RenderTextureROIList.ContainsKey(area)) // return Vector2.zero; // Rect textureROI = RenderTextureROIList[area]; // Vector2 currenPos = Vector2.zero; // switch (area) // { // case Area.LeftWall: // currenPos = Rect.NormalizedToPoint(textureROI, new Vector2(1 - wallROI.y, 1 - wallROI.x)); // break; // case Area.RightWall: // currenPos = Rect.NormalizedToPoint(textureROI, new Vector2(wallROI.y, 1 - wallROI.x)); // break; // case Area.TopWall: // currenPos = Rect.NormalizedToPoint(textureROI, new Vector2(wallROI.x, 1 - wallROI.y)); // break; // } // currenPos = new Vector2(currenPos.x * Screen.width, (1 - currenPos.y) * Screen.height); // return currenPos; // } public Vector2 GetWallRoiFromPosition(Area area, Vector3 position) { position -= transform.position; Vector2 roi = Vector2.zero; switch (area) { case Area.TopWall: roi.x = (position.x + width * 0.5f) / width; roi.y = position.y / height; break; case Area.LeftWall: roi.x = (position.z + depth * 0.5f) / depth; roi.y = position.y / height; break; case Area.RightWall: roi.x = (position.z + depth * 0.5f) / depth; roi.y = position.y / height; break; } // Debug.Log($"{area} {position.ToString()} {roi.ToString()}"); return roi; } public Vector3 Position { get { return transform.position; } } }