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; } }