Newer
Older
fall / FallUnity / Assets / IsoSorting / IsoHandler.cs
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;
    }
}