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 }

 

------------恢复内容结束------------

posted @ 2022-07-12 17:37  枫亦  阅读(35)  评论(0)    收藏  举报