L'effetto di shake, vibrazione o terremoto è facilmente implementabile utilizzando alcuni metodi come Random.insideUnitCircle che genera randomicamente un punto in un cerchio di raggio 1.
Risulta quindi facilmente applicabile ad una sprite soprattutto in ambiente 2D. Considerando la generazione di un punto randomico in un cerchio, avente cento coordinate 0x, 0y possiamo facilmente applicare una forza per moltiplicare la "potenza" quindi il raggio d'azione.
Supponiamo di aver ottenuto un punto random "Random Point 1" di coordinate (esempio) -0.5x e -0.6y a cui applicheremo una costante, che chiameremo forza dello shake ma in sostanza è un aumento del raggio per esempio forza 2.
Quindi avremo una nuova posizione(ambiente 2d) con coordinate:
Vector3.x = random.x * forza
Vector3.y = random.y * forza
Vector3.z = z_originale
Detto ciò possiamo creare uno script che attivi e disattivi lo shake, vibrazione o terremoto che dir si voglia, dove viene parametrizzato il parametro forza come input. Questo script è applicabile alla sprite sulla quale si vuole agire.
using UnityEngine; using System.Collections; public class ShakeEffect : MonoBehaviour { // vars private bool shakeOn = false; private float shakePower = 0; // sprite original position private Vector3 originPosition; // Use this for initialization void Start () { } // Update is called once per frame void Update () { // if shake is enabled if(shakeOn) { // reset original position transform.position = originPosition; // generate random position in a 1 unit circle and add power Vector2 ShakePos = Random.insideUnitCircle * shakePower; // transform to new position adding the new coordinates transform.position = new Vector3 (transform.position.x + ShakePos.x, transform.position.y + ShakePos.y, transform.position.z); } } // shake on public void ShakeCameraOn(float sPower){ //save position before start shake, //this it's really important otherwise //the sprite can goes away and will not return //in native position originPosition = transform.position; //enable shaking and setting power shakeOn = true; shakePower = sPower; } // shake off public void ShakeCameraOff(){ // shake off shakeOn = false; // set original position after transform.position = originPosition; } }
Per qualsiasi dubbi o domande commentate.