using System.Collections;
|
using System.Collections.Generic;
|
using UnityEngine;
|
[ExecuteAlways]
|
[RequireComponent(typeof(RectTransform))]
|
public class Datumline : MonoBehaviour {
|
|
[System.NonSerialized] RectTransform m_Rect;
|
public RectTransform rectTransform
|
{
|
get
|
{
|
return m_Rect ?? (m_Rect = GetComponent<RectTransform>());
|
}
|
}
|
[System.NonSerialized] Canvas m_Canva;
|
public Canvas canvas
|
{
|
get
|
{
|
return m_Canva ?? (m_Canva = GetComponentInParent<Canvas>());
|
}
|
}
|
|
public List<DatumlineData> datumlines { get; private set; }
|
private List<DatumlineData> horizonlines = new List<DatumlineData>();
|
private List<DatumlineData> verticallins = new List<DatumlineData>();
|
|
private int m_SelectDatumline = 0;
|
public int SelectDatumline
|
{
|
get
|
{
|
return m_SelectDatumline;
|
}
|
}
|
|
private void Awake()
|
{
|
datumlines = new List<DatumlineData>();
|
}
|
|
private void OnEnable()
|
{
|
if (datumlines == null)
|
{
|
datumlines = new List<DatumlineData>();
|
}
|
if (datumlines.Count == 0)
|
{
|
Add();
|
}
|
}
|
|
private void OnDisable()
|
{
|
|
}
|
|
public void Add()
|
{
|
var _datumline = new DatumlineData();
|
_datumline.type = HorizonOrVertical.Vertical;
|
_datumline.from = new Vector3(0, rectTransform.rect.height / 2, 0);
|
_datumline.to = new Vector3(0, -rectTransform.rect.height / 2, 0);
|
_datumline.color = Color.white;
|
datumlines.Add(_datumline);
|
}
|
|
public DatumlineData Add(DatumlineData _line)
|
{
|
var _datumline = new DatumlineData();
|
_datumline.type = _line.type;
|
_datumline.from = _line.from;
|
_datumline.to = _line.to;
|
_datumline.color = _line.color;
|
datumlines.Add(_datumline);
|
return _datumline;
|
}
|
|
public void ChangeVector(int _index)
|
{
|
var _datumline = datumlines[_index];
|
_datumline.type = 1 - _datumline.type;
|
if (_datumline.type == HorizonOrVertical.Horizon)
|
{
|
_datumline.from = new Vector3(-rectTransform.rect.width / 2, _datumline.from.x, 0);
|
_datumline.to = new Vector3(rectTransform.rect.width / 2, _datumline.from.x, 0);
|
}
|
else
|
{
|
_datumline.from = new Vector3(_datumline.from.y, rectTransform.rect.height / 2, 0);
|
_datumline.to = new Vector3(_datumline.from.y, -rectTransform.rect.height / 2, 0);
|
}
|
}
|
|
public void Remove(int _index)
|
{
|
if (datumlines.Count == 1)
|
{
|
return;
|
}
|
datumlines.RemoveAt(_index);
|
}
|
|
public Vector3 ToWorldValue(Vector3 _pos)
|
{
|
return _pos * canvas.transform.localScale.x;
|
}
|
|
public float ToScenceValue(float _value)
|
{
|
return _value / canvas.transform.localScale.x;
|
}
|
|
public void SetSelect(int _index)
|
{
|
if (_index < datumlines.Count)
|
{
|
m_SelectDatumline = _index;
|
}
|
}
|
|
public List<DatumlineData> GetLines(HorizonOrVertical _type)
|
{
|
var _list = datumlines.FindAll((x) =>
|
{
|
return x.type == _type;
|
});
|
if (_list != null)
|
{
|
switch (_type)
|
{
|
case HorizonOrVertical.Horizon:
|
horizonlines.Clear();
|
horizonlines.AddRange(_list);
|
horizonlines.Sort(Compare);
|
break;
|
case HorizonOrVertical.Vertical:
|
verticallins.Clear();
|
verticallins.AddRange(_list);
|
verticallins.Sort(Compare);
|
break;
|
}
|
}
|
return _type == HorizonOrVertical.Horizon ? horizonlines : verticallins;
|
}
|
|
private int Compare(DatumlineData x, DatumlineData y)
|
{
|
return x.type == HorizonOrVertical.Horizon ? x.from.y.CompareTo(y.from.y) : x.from.x.CompareTo(y.from.x);
|
}
|
|
public class DatumlineData
|
{
|
public Vector3 from { get; set; }
|
public Vector3 to { get; set; }
|
public HorizonOrVertical type { get; set; }
|
public Color color { get; set; }
|
}
|
|
public enum HorizonOrVertical
|
{
|
Horizon,
|
Vertical,
|
}
|
}
|