unity 实现聚合效果
------------恢复内容开始------------
c#代码部分
1 using UnityEngine; 2 using UnityEngine.UI; 3 using UnityEngine.Events; 4 using UnityEngine.EventSystems; 5 using System.Collections.Generic; 6 7 public class T9 : MonoBehaviour 8 { 9 //需要聚合的对象(例子中的Unity图标) 10 public Image target; 11 //Canvas对象 12 public Canvas canvas; 13 14 public RectTransform ta; 15 16 private Vector4 m_Center; 17 private Material m_Material; 18 private float m_Diameter; //直径 19 private float m_Current = 0f; 20 21 Vector3[] corners = new Vector3[4]; 22 Vector2 tipPos; 23 void Awake() 24 { 25 26 target.rectTransform.GetWorldCorners(corners); 27 m_Diameter = Vector2.Distance(WorldToCanvasPos(canvas, corners[0]), 28 WorldToCanvasPos(canvas, corners[2])) / 2f; 29 30 float x = corners[0].x + ((corners[3].x - corners[0].x) / 2f); 31 float y = corners[0].y + ((corners[1].y - corners[0].y) / 2f); 32 33 Vector3 center = new Vector3(x, y, 0f); 34 Vector2 position = Vector2.zero; 35 RectTransformUtility.ScreenPointToLocalPointInRectangle(canvas.transform 36 as RectTransform, center, canvas.GetComponent<Camera>(), out position); 37 38 39 40 41 center = new Vector4(position.x, position.y, 0f, 0f); 42 m_Material = GetComponent<Image>().material; 43 m_Material.SetVector("_Center", center); 44 45 46 47 (canvas.transform as RectTransform).GetWorldCorners(corners); 48 for (int i = 0; i < corners.Length; i++) 49 { 50 m_Current = Mathf.Max(Vector3.Distance(WorldToCanvasPos(canvas, corners 51 [i]), center), m_Current); 52 } 53 54 m_Material.SetFloat("_Silder", m_Current); 55 tipPos = new Vector2(position.x + 100f, position.y); 56 } 57 58 59 float yVelocity = 0f; 60 void Update() 61 { 62 float value = Mathf.SmoothDamp(m_Current, m_Diameter, ref yVelocity, 0.3f); 63 if (!Mathf.Approximately(value, m_Current)) 64 { 65 m_Current = value; 66 m_Material.SetFloat("_Silder", m_Current); 67 68 } 69 else 70 { 71 ta.anchoredPosition = tipPos; 72 } 73 if (Input.GetMouseButtonDown(0)) 74 { 75 Awake(); 76 } 77 } 78 79 80 81 Vector2 WorldToCanvasPos(Canvas canvas, Vector3 world) 82 { 83 Vector2 position = Vector2.zero; 84 RectTransformUtility.ScreenPointToLocalPointInRectangle(canvas.transform 85 as RectTransform, world, canvas.GetComponent<Camera>(), out position); 86 return position; 87 } 88 89 }
Shader部分
1 Shader "UI/Default_Mask" 2 { 3 Properties 4 { 5 [PerRendererData] _MainTex("Sprite Texture", 2D) = "white" {} 6 _Color("Tint", Color) = (1,1,1,1) 7 8 _StencilComp("Stencil Comparison", Float) = 8 9 _Stencil("Stencil ID", Float) = 0 10 _StencilOp("Stencil Operation", Float) = 0 11 _StencilWriteMask("Stencil Write Mask", Float) = 255 12 _StencilReadMask("Stencil Read Mask", Float) = 255 13 14 15 _ColorMask("Color Mask", Float) = 15 16 17 18 [Toggle(UNITY_UI_ALPHACLIP)] _UseUIAlphaClip("Use Alpha Clip", Float) = 0 19 20 //-------------------add---------------------- 21 _Center("Center", vector) = (0, 0, 0, 0) 22 _Silder("_Silder", Range(0,1000)) = 1000 //sliders 23 //-------------------add---------------------- 24 } 25 26 SubShader 27 { 28 Tags 29 { 30 "Queue" = "Transparent" 31 "IgnoreProjector" = "True" 32 "RenderType" = "Transparent" 33 "PreviewType" = "Plane" 34 "CanUseSpriteAtlas" = "True" 35 } 36 37 Stencil 38 { 39 Ref[_Stencil] 40 Comp[_StencilComp] 41 Pass[_StencilOp] 42 ReadMask[_StencilReadMask] 43 WriteMask[_StencilWriteMask] 44 } 45 46 Cull Off 47 Lighting Off 48 ZWrite Off 49 ZTest[unity_GUIZTestMode] 50 Blend SrcAlpha OneMinusSrcAlpha 51 ColorMask[_ColorMask] 52 53 Pass 54 { 55 Name "Default" 56 CGPROGRAM 57 #pragma vertex vert 58 #pragma fragment frag 59 #pragma target 2.0 60 61 #include "UnityCG.cginc" 62 #include "UnityUI.cginc" 63 64 #pragma multi_compile __ UNITY_UI_ALPHACLIP 65 66 struct appdata_t 67 { 68 float4 vertex : POSITION; 69 float4 color : COLOR; 70 float2 texcoord : TEXCOORD0; 71 UNITY_VERTEX_INPUT_INSTANCE_ID 72 }; 73 74 struct v2f 75 { 76 float4 vertex : SV_POSITION; 77 fixed4 color : COLOR; 78 float2 texcoord : TEXCOORD0; 79 float4 worldPosition : TEXCOORD1; 80 UNITY_VERTEX_OUTPUT_STEREO 81 82 }; 83 84 fixed4 _Color; 85 fixed4 _TextureSampleAdd; 86 float4 _ClipRect; 87 //-------------------add---------------------- 88 float _Silder; 89 float2 _Center; 90 //-------------------add---------------------- 91 v2f vert(appdata_t IN) 92 { 93 v2f OUT; 94 UNITY_SETUP_INSTANCE_ID(IN); 95 UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(OUT); 96 OUT.worldPosition = IN.vertex; 97 OUT.vertex = UnityObjectToClipPos(OUT.worldPosition); 98 99 OUT.texcoord = IN.texcoord; 100 101 OUT.color = IN.color * _Color; 102 return OUT; 103 } 104 105 sampler2D _MainTex; 106 107 fixed4 frag(v2f IN) : SV_Target 108 { 109 half4 color = (tex2D(_MainTex, IN.texcoord) + _TextureSampleAdd) * 110 IN.color; 111 112 color.a *= UnityGet2DClipping(IN.worldPosition.xy, _ClipRect); 113 114 #ifdef UNITY_UI_ALPHACLIP 115 clip(color.a - 0.001); 116 #endif 117 //-------------------add---------------------- 118 color.a *= (distance(IN.worldPosition.xy,_Center.xy) > _Silder); 119 color.rgb *= color.a; 120 //-------------------add---------------------- 121 return color; 122 123 } 124 ENDCG 125 } 126 } 127 }
------------恢复内容结束------------

浙公网安备 33010602011771号