Dans la version gratuite d'Unity, vous ne pouvez pas activer le système d'ombres temps réel, mais par contre vous pouvez utiliser un Projector qui permet de projeter une texture sur une surface à la manière d'une lampe torche. L'inconvénient est que le projecteur traverse toutes les surfaces. Pour calculer la distance exacte de la projection, il suffit de calculer la distance située entre le personnage et la surface la plus proche sous ses pieds.

Pour cela, j'utilise le système de raycasting c'est à dire que je projette en permanence un rayon vertical et vers le bas à partir de la position du personnage. Lorsque le rayon touche un obstacle, j'utilise un script qui calcule la distance parcouru et ensuite j'applique ce chiffre au paramètre farClipPlane (en fait la distance de projection) du projecteur.

Je limite ainsi, la projection au premier obstacle et je vous résume le tout en script :

var myTransform:Transform; // personnage principal
var shadow:Projector ; //on variabilise le projector
function Update(){ // on lance une boucle permanente
    if (Physics.Raycast (myTransform.position, - Vector3.up, hit, 100)) // on envoie un rayon de la position du perso vers le bas et à une distance de 100, en cas d'impact, la valeur renvoyée est hit
    {
        //::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
        var dist = Vector3.Distance(shadow.transform.position, hit.point); // on calcule la distance du perso au point d'impact
        shadow.farClipPlane =dist; // on change la valeur de la propriété farClipPlane  du projecteur
        //::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
    }
}

Le résultat avant/après :