using System.Collections; using System.Collections.Generic; using UnityEngine; public class IsoHandler : MonoBehaviour { private HashSet<IsoSprite> sprites = new HashSet<IsoSprite>(); private List<IsoSprite> spriteList = new List<IsoSprite>(); private Camera mainCamera; public void AddIsoSprite(IsoSprite sprite) { if (sprites.Add(sprite)) { spriteList.Add(sprite); } } public void RemoveIsoSprite(IsoSprite sprite) { if (sprites.Remove(sprite)) { spriteList.Remove(sprite); } } private List<IsoPiece> pieceList = new List<IsoPiece>(); public void AddIsoPiece(IsoPiece piece) { if (!pieceList.Contains(piece)) { pieceList.Add(piece); } } public void RemoveIsoPiece(IsoPiece piece) { pieceList.Remove(piece); } // Use this for initialization void Start () { mainCamera = GameObject.Find("Main Camera").GetComponent<Camera>(); mainCamera.transparencySortMode = TransparencySortMode.Orthographic; } int SpriteSort(IsoSprite a, IsoSprite b) { float diff = b.CameraDepth - a.CameraDepth; if (diff > 0) return 1; if (diff < 0) return -1; return 0; } int PieceSort(IsoPiece a, IsoPiece b) { float diff = b.CameraDepth - a.CameraDepth; if (diff > 0) return 1; if (diff < 0) return -1; return 0; } private List<IsoSprite> frontSort = new List<IsoSprite>(); private float nextDepth = 0; void LateUpdate() { frontSort.Clear(); for (int i = 0; i < pieceList.Count; i++) { pieceList[i].Behind.Clear(); pieceList[i].CameraDepth = Utils.GetDepthInOrthoCam(pieceList[i].LinkedImage, mainCamera); } for (int i = 0; i < spriteList.Count; i++) { spriteList[i].CameraDepth = Utils.GetDepthInOrthoCam(spriteList[i].gameObject, mainCamera); } spriteList.Sort(SpriteSort); int layer = LayerMask.GetMask("iso_piece"); RaycastHit hitInfo = new RaycastHit(); for (int i = 0; i < spriteList.Count; i++) { IsoSprite sprite = spriteList[i]; if (Physics.Raycast(new Ray(sprite.transform.position, -mainCamera.transform.forward), out hitInfo, sprite.CameraDepth, layer)) { IsoPiece piece = hitInfo.collider.GetComponentInParent<IsoPiece>(); piece.Behind.Add(sprite); } else { frontSort.Add(sprite); } } pieceList.Sort(PieceSort); nextDepth = 990; for (int i = 0; i < pieceList.Count; i++) { IsoPiece piece = pieceList[i]; for (int j = 0; j < piece.Behind.Count; j++) { SortObject(piece.Behind[j].gameObject, piece.Behind[j].Mesh); } SortObject(piece.LinkedImage, piece.LinkedImage); } for (int i = 0; i < frontSort.Count; i++) { SortObject(frontSort[i].gameObject, frontSort[i].Mesh); } } private void SortObject(GameObject getPos, GameObject setPos) { Vector2 xy = Utils.GetPosInOrthoCam(getPos, mainCamera); Transform camT = mainCamera.transform; Vector3 p = camT.position + camT.right * xy.x + camT.up * xy.y + camT.forward * nextDepth; setPos.transform.position = p; nextDepth -= 0.001f; } }