Ordinateurs

Comment faire pivoter des objets dans Unity

Matt Bird écrit toutes sortes de bêtises, mais il aime écrire des tutoriels pour Unity.

Il existe de nombreuses raisons pour lesquelles vous pouvez faire pivoter un objet dans Unity. Peut-être qu’une porte doit se balancer sur un point de pivot, ou qu’un ennemi doit tourner d’une manière particulière lorsqu’il vole dans les airs, ou, très probablement, qu’un personnage peut avoir besoin de se retourner lorsqu’il est déplacé. La rotation est utile pour les jeux 2D et 3D, et avoir au moins une base sur la façon de le faire est sage.

Il existe, en général, trois manières différentes de faire pivoter un objet dans Unity.

Captures d’écran prises par moi-même. Unity détenu et développé par Unity Technologies.

Méthode 1 : Rotation dans la vue de la scène

Regardez la capture d’écran ci-dessus. Ici, nous avons un objet sur un plan 3D dans la fenêtre Scene View. Normalement, lorsque vous sélectionnez un objet, il aura des flèches de guidage qui vous permettront de le déplacer, mais pour le moment, il est entouré de trois anneaux. Si vous cliquez sur l’outil Rotation dans le coin supérieur gauche de l’écran – c’est une paire de flèches formées en cercle – les anneaux apparaîtront, vous permettant de faire pivoter l’objet librement. Réglez-le comme bon vous semble.

L’anneau rouge changera l’orientation de l’axe x de l’objet ; l’anneau vert changera l’orientation de l’axe y de l’objet et l’anneau bleu changera l’orientation de l’axe z de l’objet.

comment faire pivoter des objets dans l'unité

Méthode 2 : Faites pivoter l’inspecteur

La deuxième méthode consiste à modifier les valeurs de rotation du GameObject. Cliquez sur l’objet et regardez l’inspecteur sur la droite. Le composant supérieur, Transform, a trois valeurs de rotation pour x, y et z. La saisie de nombres dans ces champs modifiera la rotation du GameObject dans la vue Scène.

(Le fait de jouer avec la rotation d’un objet peut parfois devenir désordonné, donc si jamais vous voulez repartir de zéro, changez simplement les trois valeurs à zéro.)

A lire aussi :  Comment utiliser la fonction COUNT dans Excel

Pendant que nous sommes dans l’inspecteur, il convient de noter que ces valeurs ne capturent que la rotation du GameObject dans une perspective globale. Si le GameObject est enfant d’un autre GameObject, ses valeurs de rotation reflètent sa rotation par rapport à son parent. Ainsi, si le parent est pivoté et que l’objet enfant est pivoté avec lui, les valeurs de rotation de l’enfant apparaîtront initialement sous la forme 0, 0 et 0.

Les deux méthodes suivantes ne sont utiles que pour faire pivoter GameObjects en dehors de l’exécution. Si vous voulez faire pivoter des objets pendant l’exécution, vous devrez faire du codage.

Méthode 3 : Rotation via le code

Un effet de rotation simple est assez facile à réaliser lors de la programmation et ne nécessite qu’une seule ligne de code pour être mis en œuvre. Ça va comme ça:

Faites défiler pour continuer

 if(Input.GetKeyDown(KeyCode.B))
        {
            itemToRotate.transform.Rotate(45f, 45f, 0f, Space.Self);
        }

Dans ce cas, nous avons un GameObject, itemToRotate, et nous voulons le définir à des angles de 45 degrés. Nous accédons à la transformation de GameObject et utilisons la fonction Rotate pour définir ses trois valeurs euler. Il y a aussi un cadre pour la relativité du GameObject, qui nous ramène à l’espace local et mondial. Si vous voulez que l’objet pivote par rapport au monde, utilisez Space.World ; si vous voulez que l’objet pivote par rapport à lui-même, utilisez Space.Self.

Ce code fera pivoter rapidement et sans douleur le GameObject. Dans la plupart des cas, cependant, il s’agit ne pas le code que vous souhaitez utiliser, car il est instantané. Pour voir le GameObject tourner activement, vous voudrez essayer quelque chose comme ceci :

private void Update()
 {
	if (Input.GetKeyDown(KeyCode.B))
	        {
	            rotateObjectBool = true;
	        }
	
	if(rotateObjectBool)
	        {
			   	rotationTime = 180f;
		        itemToRotate.transform.Rotate(Vector3.down * (rotationTime * Time.deltaTime));
	        }
}

Ici, nous utilisons un déclencheur bool simple, rotateObjectBool, pour mettre la rotation en mouvement. Lorsque le joueur appuie sur la touche B, itemToRotate commence à tourner le long d’un Vector3 au fil du temps. Time.deltatime mesure le temps écoulé depuis la dernière image, donc multiplier une valeur par Time.deltatime vous donnera une belle rotation en temps réel. La modification de la variable rotationTime accélérera (valeur supérieure) ou ralentira (valeur inférieure) la vitesse de rotation.

A lire aussi :  Quel est le meilleur ordinateur portable de jeu à petit budget ?

Vector3.down diminuera la valeur y de l’objet au fil du temps. si vous utilisez Vector3.up à la place, cela augmentera la valeur y de l’objet et le fera tourner dans la direction opposée. Vector3.right et Vector3.left ont un effet similaire sur la valeur x de l’objet. Si vous le souhaitez, vous pouvez avoir des lignes qui affectent simultanément les valeurs x et y, ce qui crée un effet de rotation soigné.

Ces variables Vector3 sont très bien lorsque vous voulez qu’un objet tourne librement pour toujours. La mise à jour les maintiendra jusqu’à ce que le jeu s’arrête ou, dans ce cas, jusqu’à ce que le booléen soit changé en faux.

Mais que se passe-t-il si vous voulez qu’un GameObject tourne vers un point spécifique puis s’arrête ? Il existe plusieurs façons de procéder, mais pour cet exemple, nous utiliserons une Coroutine. Les coroutines sont des fonctions qui exécutent du code au fil du temps et peuvent être arrêtées à un point désigné. Nous allons utiliser une Coroutine pour créer l’effet de rotation sans mise à jour :

private void Update()
    {   

		if (Input.GetKeyDown(KeyCode.B))
		        {        
		            StartCoroutine(RotateObject());
		        }      
		 
    }  

IEnumerator RotateObject()
{
        float moveSpeed = 50f;        
        Quaternion endingAngle = Quaternion.Euler(new Vector3(45, 45, 0));        

        while (Vector3.Distance(itemToRotate.transform.rotation.eulerAngles, endingAngle.eulerAngles) > 0.01f)    
        {
            itemToRotate.transform.rotation = Quaternion.RotateTowards(itemToRotate.transform.rotation, endingAngle, moveSpeed * Time.deltaTime);           
            yield return null;
        }        

        itemToRotate.transform.rotation = endingAngle;
}

Nous commençons en appuyant sur la touche B. Cela déclenche le code StartCoroutine, avec la coroutine RotateObject() comme cible. Les coroutines nécessitent toujours ‘StartCoroutine’ avant de se déclencher, alors n’oubliez pas ce morceau de code vital.

Une fois que le IEnumerator est déclenché, il met en jeu deux variables locales. moveSpeed ​​​​dicte la vitesse de rotation, tandis que le Quaternion endingAngle détermine les angles souhaités que vous souhaitez que le GameObject atteigne. (Dans la plupart des cas, vous définirez les valeurs de endingAngle en dehors de la Coroutine, mais cet exemple devient suffisamment compliqué tel quel, nous allons donc le garder simple.)

A lire aussi :  Comment ouvrir et utiliser le Gestionnaire des tâches sur un PC

La prochaine étape est l’instruction while(). while() agit comme une sorte de Update() local, exécutant le code qu’il contient en continu jusqu’à ce que les conditions d’arrêt soient remplies. Dans ce cas, while() s’exécutera jusqu’à ce que les valeurs Rotation de itemToRotate soient 0,01f différentes de celles de endingAngle, en utilisant Distance pour calculer en continu la différence entre ces valeurs. Lors de l’exécution, les valeurs de rotation de itemToRotate utiliseront Quaternion.RotateTowards, qui ajuste progressivement les valeurs x et y jusqu’à ce qu’elles correspondent presque – mais pas tout à fait exactement – à ce que vous voulez.

(yield return null; dicte combien de temps attendra avant d’exécuter à nouveau le changement de rotation. Le laisser à ‘null’ vous donnera un virage continu et fluide.)

RotateTowards va jamais atteignez les valeurs exactes que vous voulez, donc une fois que l’instruction while() se rapproche suffisamment, elle s’interrompra. Nous avons ensuite défini les valeurs Rotation de itemToRotate sur celles de endingAngle, ce qui donne des valeurs agréables et propres plutôt qu’un tas de décimales. Le changement de valeurs est si faible qu’il n’y a aucun mouvement perceptible à l’écran. là! Objet tourné.

Encore une fois, il existe de nombreuses façons d’obtenir ce même effet, et les résultats varient en fonction du chemin que vous empruntez. En tant que petite substitution, vous pouvez essayer ‘Quaternion.Lerp’ ou ‘Quaternion.Slerp’ au lieu de RotateTowards, ce qui entraîne des rotations plus progressives qui ralentissent à mesure qu’elles se rapprochent de leurs extrémités.

Ce contenu est exact et fidèle au meilleur de la connaissance de l’auteur et ne vise pas à remplacer les conseils formels et individualisés d’un professionnel qualifié.

Bouton retour en haut de la page