Skip to content

Commit 84e8e8b

Browse files
committed
fix: shake with time
1 parent 13a926d commit 84e8e8b

File tree

1 file changed

+63
-42
lines changed

1 file changed

+63
-42
lines changed

Assets/JCSUnity/Scripts/Effects/3D/JCS_3DShakeEffect.cs

Lines changed: 63 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -28,16 +28,22 @@ public class JCS_3DShakeEffect : JCS_UnityObject
2828
// Callback executed after the shake effect.
2929
public Action onAfterShake = null;
3030

31+
private Vector3 mStartPosition = Vector3.zero;
32+
3133
#if UNITY_EDITOR
3234
[Separator("Helper Variables (JCS_3DShakeEffect)")]
3335

3436
[Tooltip("Test this component with key.")]
3537
[SerializeField]
3638
private bool mTestWithKey = false;
3739

38-
[Tooltip("Do wave effect key.")]
40+
[Tooltip("Key to shake once.")]
41+
[SerializeField]
42+
private KeyCode mKeyShake = KeyCode.Y;
43+
44+
[Tooltip("Key to shake continously.")]
3945
[SerializeField]
40-
private KeyCode mDoEffectKey = KeyCode.Y;
46+
private KeyCode mKeyShakeForce = KeyCode.U;
4147
#endif
4248

4349
[Separator("Check Variables (JCS_3DShakeEffect)")]
@@ -142,10 +148,15 @@ private void Test()
142148
if (!mTestWithKey)
143149
return;
144150

145-
if (JCS_Input.GetKeyDown(mDoEffectKey))
151+
if (JCS_Input.GetKeyDown(mKeyShake))
146152
{
147153
DoShake();
148154
}
155+
156+
if (JCS_Input.GetKey(mKeyShakeForce))
157+
{
158+
DoShake(true);
159+
}
149160
}
150161
#endif
151162

@@ -156,7 +167,11 @@ private void Test()
156167
/// <param name="margin"> margin to do the shake. </param>
157168
public void DoShake()
158169
{
159-
DoShake(mTime, mMargin, mForce);
170+
DoShake(mForce);
171+
}
172+
public void DoShake(bool force)
173+
{
174+
DoShake(mTime, mMargin, force);
160175
}
161176
public void DoShake(float time, float margin, bool force)
162177
{
@@ -174,7 +189,7 @@ public void DoShake(float time, float margin, bool force)
174189
this.mTimer = 0.0f;
175190
this.mMargin = margin;
176191

177-
mDelta = Vector3.zero;
192+
RevertShakeByTransformType(mDelta);
178193

179194
mEffect = true;
180195

@@ -193,29 +208,26 @@ private void DoEffect()
193208

194209
RevertShakeByTransformType(mDelta);
195210

196-
mDelta = Vector3.zero;
197-
198211
float dt = JCS_Time.ItTime(mTimeType);
199212

200-
// Handle pause situation.
201-
{
202-
var pm = JCS_PauseManager.instance;
203-
204-
if (pm != null && pm.Paused)
205-
return;
206-
}
207-
208213
mTimer += dt;
209214

210215
if (mTimer < mTime)
211216
{
217+
if (mTimer <= 0.0f)
218+
return;
219+
220+
float timeStep = mTime / mTimer;
221+
222+
float amount = (mMargin * timeStep / mSteps) * dt;
223+
212224
// shake randomly
213225
if (mOnX)
214-
mDelta.x = (JCS_Random.RangeInclude(-1.0f, 1.0f)) * mMargin * (mTime / mTimer) / mSteps;
226+
mDelta.x = (JCS_Random.RangeInclude(-1.0f, 1.0f)) * amount;
215227
if (mOnY)
216-
mDelta.y = (JCS_Random.RangeInclude(-1.0f, 1.0f)) * mMargin * (mTime / mTimer) / mSteps;
228+
mDelta.y = (JCS_Random.RangeInclude(-1.0f, 1.0f)) * amount;
217229
if (mOnZ)
218-
mDelta.z = (JCS_Random.RangeInclude(-1.0f, 1.0f)) * mMargin * (mTime / mTimer) / mSteps;
230+
mDelta.z = (JCS_Random.RangeInclude(-1.0f, 1.0f)) * amount;
219231

220232
ApplyShakeByTransformType(mDelta);
221233

@@ -245,44 +257,47 @@ private void PlayeSound()
245257
/// Apply shake delta by transform type.
246258
/// </summary>
247259
/// <param name="shakeDelta"> Shake delta value. </param>
248-
private void ApplyShakeByTransformType(Vector3 shakeDelta)
260+
private void ApplyShakeByTransformType(Vector3 delta)
249261
{
262+
if (JCS_Mathf.IsNaN(delta) || JCS_Mathf.IsInfinity(delta))
263+
return;
264+
250265
switch (this.mTransformType)
251266
{
252267
/* Transform */
253268
case JCS_TransformType.POSITION:
254-
this.transform.position += shakeDelta;
269+
this.transform.position += delta;
255270
break;
256271
case JCS_TransformType.ROTATION:
257-
this.transform.eulerAngles += shakeDelta;
272+
this.transform.eulerAngles += delta;
258273
break;
259274
case JCS_TransformType.SCALE:
260-
this.transform.localScale += shakeDelta;
275+
this.transform.localScale += delta;
261276
break;
262277
/* RectTransform */
263278
case JCS_TransformType.ANCHOR_MIN:
264-
mRectTransform.anchorMin += (Vector2)shakeDelta;
279+
mRectTransform.anchorMin += (Vector2)delta;
265280
break;
266281
case JCS_TransformType.ANCHOR_MAX:
267-
mRectTransform.anchorMax += (Vector2)shakeDelta;
282+
mRectTransform.anchorMax += (Vector2)delta;
268283
break;
269284
case JCS_TransformType.SIZE_DELTA:
270-
mRectTransform.sizeDelta += (Vector2)shakeDelta;
285+
mRectTransform.sizeDelta += (Vector2)delta;
271286
break;
272287
case JCS_TransformType.PIVOT:
273-
mRectTransform.pivot += (Vector2)shakeDelta;
288+
mRectTransform.pivot += (Vector2)delta;
274289
break;
275290
case JCS_TransformType.ANCHOR_POSITION:
276-
mRectTransform.anchoredPosition += (Vector2)shakeDelta;
291+
mRectTransform.anchoredPosition += (Vector2)delta;
277292
break;
278293
case JCS_TransformType.ANCHOR_POSITION_3D:
279-
mRectTransform.anchoredPosition3D += shakeDelta;
294+
mRectTransform.anchoredPosition3D += delta;
280295
break;
281296
case JCS_TransformType.OFFSET_MIN:
282-
mRectTransform.offsetMin += (Vector2)shakeDelta;
297+
mRectTransform.offsetMin += (Vector2)delta;
283298
break;
284299
case JCS_TransformType.OFFSET_MAX:
285-
mRectTransform.offsetMax += (Vector2)shakeDelta;
300+
mRectTransform.offsetMax += (Vector2)delta;
286301
break;
287302
}
288303
}
@@ -291,46 +306,52 @@ private void ApplyShakeByTransformType(Vector3 shakeDelta)
291306
/// Revert shake delta by transform type.
292307
/// </summary>
293308
/// <param name="shakeDelta"> Shake delta value. </param>
294-
private void RevertShakeByTransformType(Vector3 shakeDelta)
309+
private void RevertShakeByTransformType(Vector3 delta)
295310
{
311+
if (JCS_Mathf.IsNaN(delta) || JCS_Mathf.IsInfinity(delta))
312+
return;
313+
296314
switch (this.mTransformType)
297315
{
298316
/* Transform */
299317
case JCS_TransformType.POSITION:
300-
this.transform.position -= shakeDelta;
318+
this.transform.position -= delta;
301319
break;
302320
case JCS_TransformType.ROTATION:
303-
this.transform.eulerAngles -= shakeDelta;
321+
this.transform.eulerAngles -= delta;
304322
break;
305323
case JCS_TransformType.SCALE:
306-
this.transform.localScale -= shakeDelta;
324+
this.transform.localScale -= delta;
307325
break;
308326
/* RectTransform */
309327
case JCS_TransformType.ANCHOR_MIN:
310-
mRectTransform.anchorMin -= (Vector2)shakeDelta;
328+
mRectTransform.anchorMin -= (Vector2)delta;
311329
break;
312330
case JCS_TransformType.ANCHOR_MAX:
313-
mRectTransform.anchorMax -= (Vector2)shakeDelta;
331+
mRectTransform.anchorMax -= (Vector2)delta;
314332
break;
315333
case JCS_TransformType.SIZE_DELTA:
316-
mRectTransform.sizeDelta -= (Vector2)shakeDelta;
334+
mRectTransform.sizeDelta -= (Vector2)delta;
317335
break;
318336
case JCS_TransformType.PIVOT:
319-
mRectTransform.pivot -= (Vector2)shakeDelta;
337+
mRectTransform.pivot -= (Vector2)delta;
320338
break;
321339
case JCS_TransformType.ANCHOR_POSITION:
322-
mRectTransform.anchoredPosition -= (Vector2)shakeDelta;
340+
mRectTransform.anchoredPosition -= (Vector2)delta;
323341
break;
324342
case JCS_TransformType.ANCHOR_POSITION_3D:
325-
mRectTransform.anchoredPosition3D -= shakeDelta;
343+
mRectTransform.anchoredPosition3D -= delta;
326344
break;
327345
case JCS_TransformType.OFFSET_MIN:
328-
mRectTransform.offsetMin -= (Vector2)shakeDelta;
346+
mRectTransform.offsetMin -= (Vector2)delta;
329347
break;
330348
case JCS_TransformType.OFFSET_MAX:
331-
mRectTransform.offsetMax -= (Vector2)shakeDelta;
349+
mRectTransform.offsetMax -= (Vector2)delta;
332350
break;
333351
}
352+
353+
// Reset.
354+
mDelta = Vector3.zero;
334355
}
335356
}
336357
}

0 commit comments

Comments
 (0)