强制性引导UI控件,关键区域镂空,自动调整关键区域大小。
效果如图:
![](/images/cppblog_com/shly/微信截图_20151231091838.png)
使用结构:
![](/images/cppblog_com/shly/微信截图_20151231092006.png)
代
1
using UnityEngine;
2
using System.Collections;
3
using UnityEngine.UI;
4![](/Images/OutliningIndicators/None.gif)
5
using System.Collections.Generic;
6
using UnityEngine.Serialization;
7![](/Images/OutliningIndicators/None.gif)
8
namespace UnityEngine.UI
9![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
10![](/Images/OutliningIndicators/InBlock.gif)
11
public class GuideHighlightMask : MaskableGraphic, UnityEngine.ICanvasRaycastFilter
12![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
13
public RectTransform arrow;
14
public Vector2 center = Vector2.zero;
15
public Vector2 size = new Vector2(100, 100);
16![](/Images/OutliningIndicators/InBlock.gif)
17
public void DoUpdate()
18![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
19
// 当引导箭头位置或者大小改变后更新,注意:未处理拉伸模式
20
if (arrow && center != arrow.anchoredPosition || size != arrow.sizeDelta)
21![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
22
this.center = arrow.anchoredPosition;
23
this.size = arrow.sizeDelta;
24
SetAllDirty();
25
}
26
}
27![](/Images/OutliningIndicators/InBlock.gif)
28
public bool IsRaycastLocationValid(Vector2 sp, Camera eventCamera)
29![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
30
// 点击在箭头框内部则无效,否则生效
31
return !RectTransformUtility.RectangleContainsScreenPoint(arrow, sp, eventCamera);
32
}
33![](/Images/OutliningIndicators/InBlock.gif)
34
protected override void OnFillVBO(List<UIVertex> vbo)
35![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
36
Vector4 outer = new Vector4(-rectTransform.pivot.x * rectTransform.rect.width,
37
-rectTransform.pivot.y * rectTransform.rect.height,
38
(1 - rectTransform.pivot.x) * rectTransform.rect.width,
39
(1 - rectTransform.pivot.y) * rectTransform.rect.height);
40![](/Images/OutliningIndicators/InBlock.gif)
41
Vector4 inner = new Vector4(center.x - size.x / 2,
42
center.y - size.y / 2,
43
center.x + size.x * 0.5f,
44
center.y + size.y * 0.5f);
45![](/Images/OutliningIndicators/InBlock.gif)
46
vbo.Clear();
47![](/Images/OutliningIndicators/InBlock.gif)
48
var vert = UIVertex.simpleVert;
49![](/Images/OutliningIndicators/InBlock.gif)
50
// left
51
vert.position = new Vector2(outer.x, outer.y);
52
vert.color = color;
53
vbo.Add(vert);
54![](/Images/OutliningIndicators/InBlock.gif)
55
vert.position = new Vector2(outer.x, outer.w);
56
vert.color = color;
57
vbo.Add(vert);
58![](/Images/OutliningIndicators/InBlock.gif)
59
vert.position = new Vector2(inner.x, outer.w);
60
vert.color = color;
61
vbo.Add(vert);
62![](/Images/OutliningIndicators/InBlock.gif)
63
vert.position = new Vector2(inner.x, outer.y);
64
vert.color = color;
65
vbo.Add(vert);
66![](/Images/OutliningIndicators/InBlock.gif)
67
// top
68
vert.position = new Vector2(inner.x, inner.w);
69
vert.color = color;
70
vbo.Add(vert);
71![](/Images/OutliningIndicators/InBlock.gif)
72
vert.position = new Vector2(inner.x, outer.w);
73
vert.color = color;
74
vbo.Add(vert);
75![](/Images/OutliningIndicators/InBlock.gif)
76
vert.position = new Vector2(inner.z, outer.w);
77
vert.color = color;
78
vbo.Add(vert);
79![](/Images/OutliningIndicators/InBlock.gif)
80
vert.position = new Vector2(inner.z, inner.w);
81
vert.color = color;
82
vbo.Add(vert);
83![](/Images/OutliningIndicators/InBlock.gif)
84
// right
85
vert.position = new Vector2(inner.z, outer.y);
86
vert.color = color;
87
vbo.Add(vert);
88![](/Images/OutliningIndicators/InBlock.gif)
89
vert.position = new Vector2(inner.z, outer.w);
90
vert.color = color;
91
vbo.Add(vert);
92![](/Images/OutliningIndicators/InBlock.gif)
93
vert.position = new Vector2(outer.z, outer.w);
94
vert.color = color;
95
vbo.Add(vert);
96![](/Images/OutliningIndicators/InBlock.gif)
97
vert.position = new Vector2(outer.z, outer.y);
98
vert.color = color;
99
vbo.Add(vert);
100![](/Images/OutliningIndicators/InBlock.gif)
101
// bottom
102
vert.position = new Vector2(inner.x, outer.y);
103
vert.color = color;
104
vbo.Add(vert);
105![](/Images/OutliningIndicators/InBlock.gif)
106
vert.position = new Vector2(inner.x, inner.y);
107
vert.color = color;
108
vbo.Add(vert);
109![](/Images/OutliningIndicators/InBlock.gif)
110
vert.position = new Vector2(inner.z, inner.y);
111
vert.color = color;
112
vbo.Add(vert);
113![](/Images/OutliningIndicators/InBlock.gif)
114
vert.position = new Vector2(inner.z, outer.y);
115
vert.color = color;
116
vbo.Add(vert);
117
}
118![](/Images/OutliningIndicators/InBlock.gif)
119
private void Update()
120![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
121
DoUpdate();
122
}
123
}
124
}
125![](/Images/OutliningIndicators/None.gif)
码: