yyl
20 小时以前 9c7efb57bf1b21954c7d81b705c8a8a34e7fb364
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
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,
    }
}