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.CameraSpace.z - a.CameraSpace.z; if (diff > 0) return 1; if (diff < 0) return -1; return 0; } int PieceSort(IsoPiece a, IsoPiece b) { float diff = b.CameraSpace.z - a.CameraSpace.z; if (diff > 0) return 1; if (diff < 0) return -1; return 0; } private List<IsoSprite> frontSort = new List<IsoSprite>(); private float nextDepth = 0; private Vector3 camForward; private Vector3 camRight; private Vector3 camUp; private Vector3 camPos; void LateUpdate() { camForward = mainCamera.transform.forward; camRight = mainCamera.transform.right; camUp = mainCamera.transform.up; camPos = mainCamera.transform.position; frontSort.Clear(); for (int i = 0; i < pieceList.Count; i++) { pieceList[i].Behind.Clear(); pieceList[i].CameraSpace = mainCamera.WorldToScreenPoint(pieceList[i].LinkedImage.transform.position); } for (int i = 0; i < spriteList.Count; i++) { spriteList[i].CameraSpace = mainCamera.WorldToScreenPoint(spriteList[i].gameObject.transform.position); } 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, -camForward), out hitInfo, sprite.CameraSpace.z, layer)) { IsoPiece piece = hitInfo.collider.GetComponentInParent<IsoPiece>(); piece.Behind.Add(sprite); } else { frontSort.Add(sprite); } } pieceList.Sort(PieceSort); nextDepth = 50; 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].CameraSpace, piece.Behind[j].gameObject, piece.Behind[j].Mesh); } SortObject(piece.CameraSpace, piece.LinkedImage, piece.LinkedImage); } for (int i = 0; i < frontSort.Count; i++) { SortObject(frontSort[i].CameraSpace, frontSort[i].gameObject, frontSort[i].Mesh); } } private void SortObject(Vector3 camPoint, GameObject getPos, GameObject setPos) { camPoint.z = nextDepth; setPos.transform.position = mainCamera.ScreenToWorldPoint(camPoint); nextDepth -= 0.001f; } }