In this little script i explains how to create a small effect bounce parameterized applicable on any game object, which then can contain any resource. It is based on a 2 phase transition and the other of the bounce. Obviously it is widely editable. Parameterization is important in order to find the desired result.
I leave to the commented code.
// Use this for initialization protected override void Start () { startPosition = gameObject.transform.position; // parameters: // BounceDecrementalPercentage percentage of displacement according to the distance traveled by the transition to the destination // BounceDecrementalConstantPercentage percentage of decremental bounceDecrementalPercentage every bounce // TotalBounceTime total effect transition time + bounce // TransitionTimePercentage percentage of totalBounceTime dedicated to the transaction // BounceTimePercentage percentage of totalBounceTime dedicated to bounce // DestinationPosition target position // StartPosition initial position 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) { // calculating the input time and the bounce time float singleTimeUnitForPercentage = totalBounceTime / 100f; // transaction time by multiplying the unit for 40% give 40% of the weight of the total of the transaction float transitionTime = singleTimeUnitForPercentage * transitionTimePercentage; // to destination yield return StartCoroutine (MoveToPosition(destinationPosition, startPosition, transitionTime)); // bounce start float destinationDistance = Vector2.Distance (startPosition, destinationObject.transform.position); // calculating the time units of the bounce and the value decremental 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; } }