Logo Makeyourgame
Accueil Les formations Créer un jeu Les ateliers Les tutoriels Blog Loterie
Logo Makeyourgame
Les formations Les financements Les exercices La certification Unity
Logo Makeyourgame
Mes objectifs Les jeux Les ressources Le glossaire
Logo Makeyourgame
Les tutos Youtube Les tutos Accompagnement Audio Documentation Godot Engine Graphisme 2D Graphisme 3D Langage C# Mini-Exercices Unity Web Phaser NoCode

Transform.localScale

Unity:Rotation et scale d’un objet sur mobile


Transform.localScale

Maintenant, on va affecter directement la scale de l’objet. Je vous propose d’utiliser transform.localScale au lieu de transform.scale, tout simplement parce que localScale nous permet de changer la scale de l’objet relative à la scale de son parent et pour cet exercice, c’est exactement ce qu’on cherche.

Je vous propose maintenant de coder un comportement pour affecter la localScale d’un objet grâce à la distance entre deux doigts. Pour cela vous aurez besoin donc de:

         -Déclarer 2 variables pour enregistrer la dernière distance et la distance actuelle

         -Déclarer une variable pour contrôler la vitesse de changement du scale

         -La condition “(Input.touchCount == 2)” pour s’assurer que le comportement va s'exécuter que quand il y a 2 doigts 

-Déclarer deux variables Touch qu’on va assigner aux 2 doigts avec “Input.GetTouch(0)” et “Input.GetTouch(1)”

-Une condition pour savoir quand le deuxieme doigt touche l’écran

-Dans cette condition, on va attribuer la valeur de la dernière distance

-Une condition pour savoir quand n’importe quel des 2 doigts passe a TouchPhase.moved

-Dans cette condition, on va attribuer la valeur de la distance actuelle

-On va soustraire la valeur de la dernière distance à celle de la distance actuelle

-On va ajouter cette valeur divisé par notre valeur de contrôle de vitesse, a chaque vecteur de notre localScale

-On attribue la valeur de la distance actuelle à la variable de la dernière distance

    private float lastScaleTouchDistance = 0;
    private float currentScaleTouchDistance = 0;

    public float scaleRatioDivider;

    void Update()
    {
        if (Input.touchCount == 2)
        {
            Touch first_touch = Input.GetTouch(0);
            Touch second_touch = Input.GetTouch(1);

            if (second_touch.phase == TouchPhase.Began)
            {
                lastScaleTouchDistance = Vector2.Distance(first_touch.position, second_touch.position);
            }

            else if (first_touch.phase == TouchPhase.Moved || second_touch.phase == TouchPhase.Moved)
            {
                currentScaleTouchDistance = Vector2.Distance(first_touch.position, second_touch.position);
                float difference = (currentScaleTouchDistance - lastScaleTouchDistance) / scaleRatioDivider;
                this.gameObject.transform.localScale += new Vector3(difference, difference, difference);
                lastScaleTouchDistance = currentScaleTouchDistance;
            }
        }
    }

Ce modèle reste une proposition et il y a beaucoup de logiques différentes possibles à appliquer pour un résultat semblable. L'intérêt de ce modèle est que lorsqu’on compare les 2 distances et on attribue à la fin la valeur de la distance actuelle à la variable de la dernière distance, si on "rétrécit" avec nos doigts, dans la prochaine update la soustraction sera négative et donc, la scale va diminuer.

Mais dans cette proposition, il y a un problème! 

On peut rétrécir la scale au-delà de 0. C'est-à-dire qu’on pourra avoir une scale négative, ce qui risque de poser des problèmes! 

Pour résoudre ça, je vous propose de passer par une variable temporelle de type Vector3, avant d’affecter la scale. Donner à cette variable la valeur de notre scale et l’affecter avec notre différence de distance. Comparer cette variable a un Vector3.zero et si c’est inférieur, lui donner la valeur d’un Vector3.zero.

Une fois que la comparaison sera faite, on attribuera la valeur du vecteur temporel au localScale.

Attention! Ce modèle reste fonctionnel que quand les 3 axes "scale" de l'objet ont la même valeur!




Validation de la session

Veuillez vous connecter ou créer un compte pour pouvoir valider cette session et ainsi gagner encore plus d'XP !


Retour à l'atelier


Continuer sur: Changement de scale sur une application mobile ?

Session précédente / suivante

Utilisation de deux doigts

Encore une fois, on va commencer par s’assurer que la reconnaissance de la distance entre 2 doigts fonctionne correctement