@@ -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