Warning: Cannot modify header information - headers already sent by (output started at /home/lalienoits/www/index.php:47) in /home/lalienoits/www/inc/cookie.php on line 6
a cadenza discontinua
Come se fossi
BLOG

Unity 2D [E2] - Applicare ad una sprite l'effetto vibrazione / terremoto

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.


di GuiZ
06/04/2016

Commenta

We'll never share your email with anyone else.