前言

这几天研究了下 技能指示器 发现作者好久没更新了,而且由于其用到了Projector组件,无法在URP管线下正常工作,所以我把它的Shader稍微改了下,接口之类的也改了下,如果需要技能指示器贴合地形的话可以接入 https://github.com/ColinLeung-NiloCat/UnityURPUnlitScreenSpaceDecalShader本仓库 也给了一个示例。

使用此指示器需要Odin插件,因为需要在编辑器编辑指示器的大小,实时预览,用到了OnValueChanged特性。

预览图如下

image-20211019230641823

功能

非指向性

image-20211019230854836

指向性(无范围提示)

image-20211019230843006

指向性(有范围提示)

image-20211019230835370

区域选择性

image-20211019230828432

可变角扇形

image-20211019230818562

状态指示器

image-20211019230808276

贴花

image-20211019230758340

使用说明

指示器基类中重要字段,支持运行时使用其对应属性实时更改。

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
public class Splat: MonoBehaviour
{
[SerializeField]
public ScaleType ScaleType = ScaleType.All;
/// <summary>
/// 指示器归属的Unit Transform
/// </summary>
[SerializeField]
public Transform SplatBelongToUnit;
/// <summary>
/// 指示器的进度,用于满足根据进度填充指示器的需求
/// </summary>
[SerializeField]
[Range(0, 1)]
[OnValueChanged("OnProgressChanged")]
protected float progress = 1;
/// <summary>
/// 缩放指示器的长度,当ScaleType & ScaleType.Length 结果为 ScaleType.Length 时有效
/// </summary>
[SerializeField]
[OnValueChanged("OnLengthChanged")]
protected float length = 1;
/// <summary>
/// 缩放指示器的宽度,当ScaleType & ScaleType.Width 结果为 ScaleType.Width 时有效
/// </summary>
[SerializeField]
[OnValueChanged("OnWidthChanged")]
protected float width = 1;
/// <summary>
/// 整体缩放指示器,仅当ScaleType为All时有效
/// </summary>
[SerializeField]
[OnValueChanged("OnScaleChanged")]
protected float scale = 1;
/// <summary>
/// 缩放系数,用于处理美术素材大小/位置不一的情况,乘以此缩放系数可得到unity单位长度的缩放
/// </summary>
public float ScaleFactor = 1;
// Properties
private static MaterialPropertyBlock _SharedMaterialPropertyBlock;
private static MaterialPropertyBlock s_SharedMaterialPropertyBlock
{
get
{
if (_SharedMaterialPropertyBlock == null)
{
_SharedMaterialPropertyBlock = new MaterialPropertyBlock
}
return _SharedMaterialPropertyBlock;
}
set
{
_SharedMaterialPropertyBlock = value;
}
}
/// <summary>
/// Set the progress bar of Spell Indicator.
/// </summary>
public float Progress
{
get
{
return progress;
}
set
{
this.progress = value;
this.OnProgressChanged(progress);
}
}

public float Length
{
get
{
return this.length;
}
set
{
this.length = value;
if ((this.ScaleType & ScaleType.Length) == ScaleType.Length)
{
this.OnLengthChanged(this.length);
}
}
}

public float Width
{
get
{
return width;
}
set
{
this.width = value;
if ((this.ScaleType & ScaleType.Width) == ScaleType.Width)
{
this.OnWidthChanged(this.width);
}
}
}

public float Scale
{
get
{
return this.scale;
}
set
{
this.scale = value;
if ((this.ScaleType & ScaleType.All) == ScaleType.All)
{
this.OnWidthChanged(this.Scale);
this.OnLengthChanged(this.Scale);
}
}
}
//....
}