a cadenza discontinua
Come se fossi
BLOG

Unity 2D [E4] - Transizione effetto bounce su sprite o testo

In questo piccolo script illustro come creare un piccolo effetto bounce parametrizzabile applicabile su qualsiasi game object, che quindi può contenere qualsiasi risorsa. Si basa su 2 fasi una di transizione e l'altra di bounce. Ovviamente è ampiamente modificabile. La parametrizzazione è importante al fine di trovare il risultato desiderato. 

Vi lascio al codice commentato.

 

// Use this for initialization
protected override void Start ()
{
	startPosition = gameObject.transform.position;	

	// parametri:
	// bounceDecrementalPercentage percentuale di spostamento in base alla distanza percorsa dalla transizione alla destination
	// bounceDecrementalConstantPercentage percentuale decrementale della bounceDecrementalPercentage ad ogni bounce
	// totalBounceTime tempo totale dell'effetto transizione + bounce
	// transitionTimePercentage percentuale del totalBounceTime dedicato alla transazione
	// bounceTimePercentage percentuale del totalBounceTime dedicato al bounce
	// destinationPosition position di destinazione
	// startPosition position iniziale
	StartCoroutine (BounceEffect(20f,2f,1.5f,30f,70f,destinationObject.transform.position,startPosition));
}

}

private IEnumerator MoveToPosition (Vector3 destinationPosition, Vector3 startPosition, float duration)
{
	float elapsedTime = 0f;
	while (elapsedTime < duration) {
		float fracComplete = elapsedTime / duration;

		transform.position = Vector3.Lerp (startPosition, destinationPosition, fracComplete);
		elapsedTime += Time.deltaTime;

		yield return null;
	}

	transform.position = Vector3.Lerp (startPosition, destinationPosition, 1);
}

private IEnumerator BounceEffect (float bounceDecrementalPercentage, float bounceDecrementalConstantPercentage, float totalBounceTime, float transitionTimePercentage, float bounceTimePercentage, Vector3 destinationPosition, Vector3 startPosition)
{
	// calcolo il tempo di entrata e i tempi di bounce
	float singleTimeUnitForPercentage = totalBounceTime / 100f; 

	// tempo di transazione moltiplicando la unit per 40% diamo il peso del 40% del totale alla transazione
	float transitionTime = singleTimeUnitForPercentage * transitionTimePercentage;

	// alla destinazione
	yield return StartCoroutine (MoveToPosition(destinationPosition, startPosition, transitionTime));

	// start il bounce
	float destinationDistance = Vector2.Distance (startPosition, destinationObject.transform.position);


	// calcolo le unità di tempo del bounce e il valore decrementale
	float timetodel = 0;
	float timeminuscomplete = (singleTimeUnitForPercentage * bounceTimePercentage) / (bounceDecrementalPercentage / bounceDecrementalConstantPercentage);

	// set bool
	bool isMinus = true;
	bool isFinish = false;

	// set for first bounce
	timetodel = timeminuscomplete;

	// bounce while
	while (!isFinish) {

		if (isMinus) {
			destinationPosition.x = destinationObject.transform.position.x - ((destinationDistance / 100f) * bounceDecrementalPercentage);
			yield return StartCoroutine (MoveToPosition(destinationPosition,gameObject.transform.position,timeminuscomplete));
			bounceDecrementalPercentage = bounceDecrementalPercentage - bounceDecrementalConstantPercentage;
			timetodel = timetodel + timeminuscomplete;
			isMinus = false;
		} else {
			destinationPosition.x = destinationObject.transform.position.x + ((destinationDistance / 100f) * bounceDecrementalPercentage);
			yield return StartCoroutine (MoveToPosition(destinationPosition,gameObject.transform.position,timeminuscomplete));
			bounceDecrementalPercentage = bounceDecrementalPercentage - bounceDecrementalConstantPercentage;
			timetodel = timetodel + timeminuscomplete;
			isMinus = true;
		}

		if (bounceDecrementalPercentage <= 0f)
			isFinish = true;

		yield return null;
	}

}

di GuiZ
04/01/2017

Commenta

We'll never share your email with anyone else.