Se volessimo far partire la nostra espressione non all’inizio del livello al quale è applicata ma ad un preciso istante?

La soluzione più immediata è quella di splittare (cmd/ctrl+shift+D) in due il livello nel punto dal quale si vuole far partire l’espressione e applicare la stessa al livello che ha il punto di In proprio sul taglio.

Questo sistema funziona bene se all’interno dell’espressione non abbiamo riferimenti a valori che dipendono dal tempo attuale (time).

Se però, ad esempio, vogliamo creare un effetto di movimento a pendolo di un livello con un decadimento graduale del movimento fino allo stop possiamo utilizzare un’espressione che prevede una funzione matematica di oscillazione (ad esempio un sinx) e una funzione di rapido decadimento (come un exp).

Potrebbe essere un’espressione di questo tipo:

Se ora splittiamo il livello per far partire il pendolo dopo 2 secondi otteniamo un’animazione palesemente errata in quanto l’espressione contiene dei precisi riferimenti al tempo corrente e pertanto ci ritroviamo con la sola parte finale dell’animazione voluta e con l’intero movimento.

In casi come questo dovremo per forza di cose procedere in altro modo. 

Utilizziamo innanzitutto dei comodissimi marcatori di livello per identificare il punto di In.

E ora costruiamo un’espressione condizionale basata sulla posizione del marcatore (marker.nearestKey = marcatore più vicino alla posizione del tempo corrente).

if (marker.numKeys > 0)

{

var inizioanimazione = marker.nearestKey(time).time; 

if (time > inizioanimazione)

{

var t = time – inizioanimazione;

transform.rotation + 100*Math.sin(10*t)/Math.exp(t)

}

else

{

transform.rotation

}

}

else

{

transform.rotation

}

In pratica abbiamo creato due condizioni. La prima verifica se sono presenti dei marcatori (if (marker.numKeys > 0)). In caso negativo non viene generata alcuna animazione. In caso positivo si passa al secondo controllo dove si verifica la posizione del marcatore più vicino (var inizioanimazione = marker.nearestKey(time).time; if (time > inizioanimazione)). Solo a partire dal marcatore verrà generata l’animazione. La variabile time verrà ricalcolata sulla base della posizione del marcatore (var t = time – inizioanimazione).

E’ sufficiente modificare la posizione del marcatore per far slittare l’inizio dell’animazione, senza alcuna necessità di modificare parametri o di splittare i livelli.

%d blogger hanno fatto clic su Mi Piace per questo: