前言
这几天研究了下 技能指示器 发现作者好久没更新了,而且由于其用到了Projector组件,无法在URP管线下正常工作,所以我把它的Shader稍微改了下,接口之类的也改了下,如果需要技能指示器贴合地形的话可以接入 https://github.com/ColinLeung-NiloCat/UnityURPUnlitScreenSpaceDecalShader ,本仓库 也给了一个示例。
使用此指示器需要Odin插件,因为需要在编辑器编辑指示器的大小,实时预览,用到了OnValueChanged特性。
预览图如下
功能
非指向性
指向性(无范围提示)
指向性(有范围提示)
区域选择性
可变角扇形
状态指示器
贴花
使用说明
指示器基类中重要字段,支持运行时使用其对应属性实时更改。
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; [SerializeField] public Transform SplatBelongToUnit; [SerializeField] [Range(0, 1)] [OnValueChanged("OnProgressChanged")] protected float progress = 1; [SerializeField] [OnValueChanged("OnLengthChanged")] protected float length = 1; [SerializeField] [OnValueChanged("OnWidthChanged")] protected float width = 1; [SerializeField] [OnValueChanged("OnScaleChanged")] protected float scale = 1; public float ScaleFactor = 1; private static MaterialPropertyBlock _SharedMaterialPropertyBlock; private static MaterialPropertyBlock s_SharedMaterialPropertyBlock { get { if (_SharedMaterialPropertyBlock == null) { _SharedMaterialPropertyBlock = new MaterialPropertyBlock } return _SharedMaterialPropertyBlock; } set { _SharedMaterialPropertyBlock = value; } } 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); } } } }
|