using UnityEngine; #if UNITY_EDITOR using UnityEditor; #endif namespace IsoTools { [ExecuteInEditMode] public class IsoObject : MonoBehaviour { #if UNITY_EDITOR Vector2 _lastTransform = Vector2.zero; Vector3 _lastPosition = Vector3.zero; Vector3 _lastSize = Vector3.zero; bool _lastSorting = false; bool _lastAlignment = false; #endif [SerializeField] Vector3 _position = Vector3.zero; /// Isometric object position. public Vector3 Position { get { return _position; } set { _position = value; FixTransform(); } } [SerializeField] Vector3 _size = Vector3.one; /// Isometric object size. public Vector3 Size { get { return _size; } set { _size = value; FixTransform(); } } [SerializeField] bool _sorting = true; /// Auto sorting tile. public bool Sorting { get { return _sorting; } set { _sorting = value; FixTransform(); } } [SerializeField] bool _alignment = true; /// Auto alignment position by isometric tile size. public bool Alignment { get { return _alignment; } set { _alignment = value; FixTransform(); } } [SerializeField] /// Isometric object tile position. public Vector3 TilePosition { get { return new Vector3( Mathf.Round(Position.x), Mathf.Round(Position.y), Mathf.Round(Position.z)); } set { Position = value; } } IsoWorld _iso_world = null; public IsoWorld IsoWorld { get { if ( !_iso_world ) { _iso_world = GameObject.FindObjectOfType(); } if ( !_iso_world ) { throw new UnityException("IsoObject. IsoWorld not found!"); } return _iso_world; } } public void ResetIsoWorld() { _iso_world = null; } public void FixTransform() { if ( Application.isEditor && Alignment ) { _position = TilePosition; } Vector3 trans = IsoWorld.IsoToScreen(Position); trans.z = transform.position.z; transform.position = trans; FixLastProperties(); MartDirtyIsoWorld(); MarkEditorObjectDirty(); } public void FixIsoPosition() { Vector2 trans = transform.position; Position = IsoWorld.ScreenToIso(trans, Position.z); } void FixLastProperties() { #if UNITY_EDITOR _lastTransform = transform.position; _lastPosition = Position; _lastSize = Size; _lastSorting = Sorting; _lastAlignment = Alignment; #endif } void MartDirtyIsoWorld() { if ( Sorting ) { IsoWorld.MarkDirty(this); } } void MarkEditorObjectDirty() { #if UNITY_EDITOR if ( Application.isEditor ) { EditorUtility.SetDirty(this); } #endif } void Awake() { FixLastProperties(); FixIsoPosition(); } void OnEnable() { MartDirtyIsoWorld(); } #if UNITY_EDITOR void Update() { if ( Application.isEditor ) { if ( !Mathf.Approximately(_lastTransform.x, transform.position.x) || !Mathf.Approximately(_lastTransform.y, transform.position.y) ) { FixIsoPosition(); } if ( _lastPosition != _position ) Position = _position; if ( _lastSize != _size ) Size = _size; if ( _lastSorting != _sorting ) Sorting = _sorting; if ( _lastAlignment != _alignment ) Alignment = _alignment; } } #endif } } // namespace IsoTools