Tanoda
CardExpanding3D.cs
Go to the documentation of this file.
1
5
6using System.Collections;
7using System.Collections.Generic;
8using UnityEngine;
9using UnityEngine.UI;
10
12{
13
14[ExecuteInEditMode]
15public class CardExpanding3D : MonoBehaviour
16{
17 [SerializeField]
18 private float lerpSpeed = 12;
19 [SerializeField]
20 private float cornerSize = 64;
21
22 [Header("Parts")]
23 public RectTransform[] cardCorners;
24 public RectTransform[] cardEdges;
25 public RectTransform cardCenter;
26
27 [Header("Card Info")]
28 [Tooltip("Positions and sizes card to its current transform.")]
29 public bool cardAutoSize = true;
30 public Vector2 cardSize;
31 public Vector2 cardPosition;
32 [Range(1, 96)]
33 public int cardSuperness = 4;
34
35 [Header("Page Info")]
36 [Tooltip("Positions and sizes the page to the top third of the screen.")]
37 public bool pageAutoSize = true;
38 public Vector2 pageSize;
39 public Vector2 pagePosition;
40 [Range(1, 96)]
41 public int pageSuperness = 96;
42
44 private int animationActive = 0;
45
46 private Vector2[] nextCornerPos = new Vector2[4];
47 private Vector2[] nextEdgePos = new Vector2[4];
48 private Vector2[] nextEdgeScale = new Vector2[4];
49 private Vector2 nextCenterScale;
50 private Vector2 nextPos;
51 private int nextSuperness;
52
53 private RectTransform rect;
54 private Vector2 nextMin;
55 private Vector2 nextMax;
56
57 void Start()
58 {
59 if (cardAutoSize)
60 {
61 cardSize = new Vector2(cardCorners[0].localScale.x * 2 + cardEdges[0].localScale.x, cardCorners[0].localScale.y * 2 + cardEdges[0].localScale.y);
62 cardPosition = cardCenter.localPosition;
63 }
64
65 if (pageAutoSize)
66 {
67 pageSize = new Vector2(Screen.width, Screen.height / 3);
68 pagePosition = new Vector2(0, Screen.height / 2 - pageSize.y / 2);
69 }
70
71 rect = GetComponent<RectTransform>();
72 }
73
74 void Update()
75 {
76 if (animationActive == 1 || animationActive == -1)
77 {
79 for (int i = 0; i < cardCorners.Length; i++)
80 {
81 cardCorners[i].localPosition = Vector3.Lerp(cardCorners[i].localPosition, nextCornerPos[i], Time.deltaTime * lerpSpeed);
82
83 cardCorners[i].GetComponent<SuperellipsePoints>().superness = Mathf.Lerp(cardCorners[i].GetComponent<SuperellipsePoints>().superness, nextSuperness, Time.deltaTime * lerpSpeed);
84
86 if (Mathf.Abs(cardCorners[i].GetComponent<SuperellipsePoints>().superness - nextSuperness) <= 1)
87 {
88 cardCorners[i].localPosition = nextCornerPos[i];
89 cardEdges[i].localPosition = nextEdgePos[i];
90 cardEdges[i].localScale = new Vector3(nextEdgeScale[i].x, nextEdgeScale[i].y, 1);
91 transform.localPosition = nextPos;
92 cardCenter.localScale = new Vector3(nextCenterScale.x, nextCenterScale.y, 1);
93 cardCorners[i].GetComponent<SuperellipsePoints>().superness = nextSuperness;
94 rect.offsetMin = nextMin;
95 rect.offsetMax = nextMax;
96 }
97 }
98
100 for (int i = 0; i < cardEdges.Length; i++)
101 {
102 cardEdges[i].localPosition = Vector3.Lerp(cardEdges[i].localPosition, nextEdgePos[i], Time.deltaTime * lerpSpeed);
103 cardEdges[i].localScale = Vector3.Lerp(cardEdges[i].localScale, new Vector3(nextEdgeScale[i].x, nextEdgeScale[i].y, 1), Time.deltaTime * lerpSpeed);
104 }
105
107 transform.localPosition = Vector3.Lerp(transform.localPosition, nextPos, Time.deltaTime * lerpSpeed);
108 cardCenter.localScale = Vector3.Lerp(cardCenter.localScale, new Vector3(nextCenterScale.x, nextCenterScale.y, 1), Time.deltaTime * lerpSpeed);
109
111 rect.offsetMin = Vector3.Lerp(rect.offsetMin, nextMin, Time.deltaTime * lerpSpeed);
112 rect.offsetMax = Vector3.Lerp(rect.offsetMax, nextMax, Time.deltaTime * lerpSpeed);
113 }
114 }
115
116 public void ToggleCard()
117 {
118 if (animationActive != 1 || animationActive == 0)
119 {
120 animationActive = 1;
121
123 for (int i = 0; i < cardCorners.Length; i++)
124 {
125 float posX = pageSize.x / 2 * Mathf.Sign(cardCorners[i].localScale.x) - cardCorners[i].localScale.x;
126 float posY = pageSize.y / 2 * Mathf.Sign(cardCorners[i].localScale.y) - cardCorners[i].localScale.y;
127
128 nextCornerPos[i] = new Vector2(posX, posY);
129 }
130
132 for (int i = 0; i < cardEdges.Length; i++)
133 {
134 float posX = 0;
135 float posY = 0;
136
137 float scaleX = 0;
138 float scaleY = 0;
139
140 if (cardEdges[i].localPosition.x != 0)
141 {
142 posX = Mathf.Sign(cardEdges[i].localPosition.x) * ((pageSize.x / 2) - (cardEdges[i].localScale.x / 2));
143 posY = 0;
144
145 scaleX = cornerSize;
146 scaleY = pageSize.y - cornerSize * 2;
147 }
148 else if (cardEdges[i].localPosition.y != 0)
149 {
150 posX = 0;
151 posY = Mathf.Sign(cardEdges[i].localPosition.y) * ((pageSize.y / 2) - (cardEdges[i].localScale.y / 2));
152
153 scaleX = pageSize.x - cornerSize * 2;
154 scaleY = cornerSize;
155 }
156
157 nextEdgePos[i] = new Vector2(posX, posY);
158 nextEdgeScale[i] = new Vector2(scaleX, scaleY);
159 }
160
161 nextCenterScale = pageSize - new Vector2(cornerSize * 2, cornerSize * 2);
162 nextPos = pagePosition;
163
164 nextSuperness = pageSuperness;
165
166 nextMin = new Vector2(-pageSize.x / 2, -pageSize.y / 2) + nextPos;
167 nextMax = new Vector2(pageSize.x / 2, pageSize.y / 2) + nextPos;
168 }
169 else if (animationActive != -1)
170 {
171 animationActive = -1;
172
174 for (int i = 0; i < cardCorners.Length; i++)
175 {
176 float posX = Mathf.Sign(cardCorners[i].localScale.x) * (cardSize.x / 2) - cardCorners[i].localScale.x;
177 float posY = Mathf.Sign(cardCorners[i].localScale.y) * (cardSize.y / 2) - cardCorners[i].localScale.y;
178
179 nextCornerPos[i] = new Vector2(posX, posY);
180 }
181
183 for (int i = 0; i < cardEdges.Length; i++)
184 {
185 float posX = 0;
186 float posY = 0;
187
188 float scaleX = 0;
189 float scaleY = 0;
190
191 if (cardEdges[i].localPosition.x != 0)
192 {
193 posX = Mathf.Sign(cardEdges[i].localPosition.x) * (cardSize.x / 2) - Mathf.Sign(cardEdges[i].localPosition.x) * (cardEdges[i].localScale.x / 2);
194 posY = 0;
195
196 scaleX = cornerSize;
197 scaleY = cardSize.y - cornerSize * 2;
198 }
199 else if (cardEdges[i].localPosition.y != 0)
200 {
201 posX = 0;
202 posY = Mathf.Sign(cardEdges[i].localPosition.y) * (cardSize.y / 2) - Mathf.Sign(cardEdges[i].localPosition.y) * (cardEdges[i].localScale.y / 2);
203
204 scaleX = cardSize.x - cornerSize * 2;
205 scaleY = cornerSize;
206 }
207
208 nextEdgePos[i] = new Vector2(posX, posY);
209 nextEdgeScale[i] = new Vector2(scaleX, scaleY);
210 }
211
212 nextCenterScale = cardSize - new Vector2(cornerSize * 2, cornerSize * 2);
213 nextPos = cardPosition;
214
215 nextSuperness = cardSuperness;
216
217 nextMin = new Vector2(-cardSize.x / 2, -cardSize.y / 2) + nextPos;
218 nextMax = new Vector2(cardSize.x / 2, cardSize.y / 2) + nextPos;
219 }
220 }
221}
222}
Credit Erdener Gonenc - @PixelEnvision.