Unity3D caméras à la troisième personne

La caméra est l’un des éléments les plus importants d’un jeu en 3D. Il agit comme les yeux du joueur, lui permettant de voir le monde du jeu sous différents angles. Dans Unity3D, une caméra 3D fonctionne exactement comme une caméra de film. Vous pouvez effectuer un panoramique, une inclinaison et un zoom pour cadrer les scènes. Ce tutoriel va vous apprendre à créer plusieurs perspectives de caméra à la troisième personne..

Pour vous inspirer ou pour utiliser votre point de départ dans votre travail, jetez un œil à certains des modèles 3D les plus populaires sur le marché Envato. Vous pouvez également obtenir une aide personnalisée en choisissant l’un des services de conception et de modélisation 3D d’Envato Studio..


Configuration du projet

Nous avons besoin d'un projet simple pour tester nos scripts de caméra. Nous aurons besoin d'une scène avec un plan au sol qui a une texture. Cela permettra de voir facilement comment chaque caméra bouge et réagit aux entrées du joueur. Lorsque nous aurons terminé, cela devrait ressembler à ceci:

Suivez ces étapes pour configurer le projet:

  1. Cliquez sur Fichier> Nouveau projet.
  2. Nommez votre dossier de projet Caméras à la 3ème personne
  3. Cliquez sur Créer
  4. Cliquez sur GameObject> Créer autre> Lumière directionnelle
  5. Cliquez sur GameObject> Créer autre> Plan
  6. Dans l'inspecteur, recherchez le composant Transform et changez la position X en 0, Y en -0,5 et Z en 0 pour qu'il soit placé sous le cube.
  7. Télécharger grid.png
  8. Faites glisser grid.png dans le panneau Projet.
  9. Faites glisser la texture de la grille du panneau de projet sur le plan du panneau Hiérarchie.
  10. Sélectionnez la caméra principale, déplacez-la et faites-la pivoter vers le haut et l'arrière du cube.
  11. Enregistrez votre scène (Fichier> Enregistrer la scène) et nommez-la. Principale

Créer un joueur

Toutes les caméras que nous allons créer auront besoin d'une cible: quelque chose à regarder ou à suivre. Alors, créons un joueur de base que nous pouvons déplacer avec les touches fléchées.

  1. Cliquez sur GameObject> Créer autre> Cube
  2. Renommez-le Player
  3. Dans l'inspecteur, assurez-vous que ses coordonnées X, Y et Z sont toutes réglées sur zéro afin que nous soyons sûrs que le lecteur est au centre du monde 3D.
  4. Cliquez sur Actifs> Créer> Script C #.
  5. Nommez le script player
  6. Faites glisser le script de lecteur du panneau Projet vers le lecteur dans le panneau Hiérarchie.

Dans le script Player, ajoutez deux propriétés publiques pour le mouvement et la vitesse de rotation. Ajoutez ensuite le code suivant à votre méthode Update ():

public class Player: MonoBehaviour public float movementSpeed ​​= 10; virage flottant publicSpeed ​​= 60; void Update () float horizontal = Input.GetAxis ("Horizontal") * TurnSpeed ​​* Time.deltaTime; transformer.Tourner (0, horizontal, 0); float vertical = Input.GetAxis ("Vertical") * movementSpeed ​​* Time.deltaTime; transformer.Translate (0, 0, vertical); 

Cela donne au joueur des commandes similaires à celles d'un tank. L'axe horizontal (les touches gauche ou droite) fait tourner le lecteur, tandis que l'axe vertical (touches haut ou bas) le déplace vers l'avant et vers l'arrière..


Le regard à la caméra

C'est l'appareil photo 3ème personne le plus fondamental. Il se trouve à un emplacement fixe dans le monde 3D et suit sa cible comme une tourelle.

  1. Cliquez sur Actifs> Créer> Script C #.
  2. Nommez le script LookAtCamera
  3. Faites glisser le script LookAtCamera du panneau Projet sur la caméra principale du panneau Hiérarchie.

Dans le script LookAtCamera, créez un attribut public pour la cible de notre caméra en haut de la classe. Les attributs publics sont exposés dans l'inspecteur et nous permettront d'affecter le lecteur à la cible de la caméra:

Classe publique LookAtCamera: MonoBehaviour public GameObject target;

Ensuite, nous devons indiquer à notre caméra la transformation pour regarder l’objet cible. Heureusement, les objets de transformation ont une méthode pratique LookAt () que nous pouvons utiliser pour cela. Nous pourrions le faire dans la méthode Update (), mais nous créons plutôt une méthode LateUpdate (). En règle générale, vous devez toujours utiliser LateUpdate () à la place de la méthode Update () dans tous les scripts de caméra. LateUpdate () se produit après la mise à jour de Update (), le script de lecteur a donc la possibilité de finir de calculer la position du joueur avant que la caméra ne calcule sa position. Cela se traduit par un mouvement de caméra plus fluide:

void LateUpdate () transform.LookAt (target.transform); 

Le script final devrait ressembler à ceci:

Classe publique LookAtCamera: MonoBehaviour public GameObject target; void LateUpdate () transform.LookAt (target.transform); 

Si vous essayez de lancer le jeu maintenant, vous obtiendrez des erreurs en vous plaignant de UnassignedReferenceException. Pour éviter cela, faites glisser le lecteur du panneau Hiérarchie et déposez-le sur la propriété Cible du script dans l'inspecteur. La caméra a maintenant une cible valide à regarder.


La caméra de donjon sur chenilles

C'est le type d'appareil photo que l'on trouve généralement dans des jeux comme Diablo, également connu sous le nom de "robot de donjon". La caméra repose au-dessus du joueur et se déplace par rapport au personnage, mais ne tourne jamais.

  1. Cliquez sur Actifs> Créer> Script C #.
  2. Nommez le script DungeonCamera
  3. Faites glisser le script DungeonCamera du panneau Projet sur la caméra principale du panneau Hiérarchie.

Dans le script DungeonCamera, nous devons à nouveau créer un attribut public pour la cible de notre caméra. Nous devons également créer une variable pour stocker le décalage entre la caméra et sa cible. Le décalage est représenté par un vecteur3 et sera utilisé pour maintenir la distance relative au fur et à mesure que le joueur se déplace. Vous remarquerez peut-être que nous ne donnons pas de valeur au décalage lorsque nous le déclarons pour la première fois. En effet, nous allons calculer la valeur lors de la première exécution du script. Nous pouvons utiliser la méthode Start () pour faire ceci:

public class DungeonCamera: MonoBehaviour public GameObject target; Vector3 offset; void Start () offset = transform.position - target.transform.position; 

Dans chaque image, nous devons mettre à jour la position de la caméra en fonction de la position du joueur en appliquant le décalage. Comme d'habitude, cela devrait être fait dans la méthode LateUpdate ():

void LateUpdate () Vector3 désiréePosition = target.transform.position + offset; tranform.position = désiréePosition; 

Faites glisser le lecteur du panneau Hiérarchie vers la propriété Cible du script dans l'inspecteur..

Améliorations facultatives

Vous remarquerez peut-être que le mouvement de la caméra est un peu raide. Il serait bien d’atténuer légèrement le mouvement pour qu’il prenne un peu de temps à rattraper le joueur. Nous pouvons le faire en utilisant la méthode Vector3.Lerp (). Lerp interpole linéairement entre deux points, ce qui signifie qu'il passe en douceur d'un point à un autre en ligne droite.

Afin de contrôler l’amortissement appliqué, nous pouvons créer un autre attribut public appelé, quoi d’autre, amortissement!

amortissement flottant public = 1;

Les deux points entre lesquels on peut se situer sont la position actuelle de la caméra avec l’amortissement appliqué et la position souhaitée sans amortissement..

void LateUpdate () Vector3 désiréePosition = target.transform.position + offset; Vector3 position = Vector3.Lerp (transformation.position, désiréePosition, amortissement Time.deltaTime *); transform.position = position;

Enfin, nous voulons que la caméra continue à regarder le joueur:

transform.LookAt (target.transform.position);

Le script final ressemble à ceci:

public class DungeonCamera: MonoBehaviour public GameObject target; amortissement flottant public = 1; Vector3 offset; void Start () offset = transform.position - target.transform.position;  void LateUpdate () Vector3 désiréePosition = target.transform.position + offset; Vector3 position = Vector3.Lerp (transformation.position, désiréePosition, amortissement Time.deltaTime *); transform.position = position; transform.LookAt (target.transform.position); 

La caméra de suivi

Ce type d'appareil photo est couramment utilisé dans les jeux de plate-forme tels que Mario Galaxy. La caméra est assise derrière et au-dessus du joueur et tourne autour du personnage.

  1. Cliquez sur Actifs> Créer> Script C #.
  2. Nommez le script FollowCamera
  3. Faites glisser le script FollowCamera du panneau Projet sur la caméra principale du panneau Hiérarchie.

Comme la caméra Dungeon Crawler, la caméra de suivi aura besoin d'un attribut public pour une cible, ainsi que d'un offset. Le décalage doit être défini dans la méthode Start ():

public class FollowCamera: MonoBehaviour public GameObject target; Vector3 offset; void Start () offset = target.transform.position - transform.position; 

Pour orienter la caméra derrière la cible, nous devons d’abord obtenir l’angle de la cible et la transformer en rotation dans la méthode LateUpdate ():

void LateUpdate () float désiréAngle = target.transform.eulerAngles.y; Quaternion rotation = Quaternion.Euler (0, désiréAngle, 0);

Nous pouvons ensuite multiplier le décalage par la rotation pour orienter le décalage de la même manière que la cible. Nous soustrayons ensuite le résultat de la position de la cible.

transform.position = target.transform.position - (rotation * offset);

Pour continuer à regarder le joueur:

transform.LookAt (target.transform);

Faites glisser le lecteur du panneau Hiérarchie vers la propriété Cible du script dans l'inspecteur..

Améliorations facultatives

Le même mouvement d'amortissement que nous avons appliqué à la caméra de donjon peut être appliqué à la caméra de suivi. Tout d'abord, nous ajoutons un attribut d'amortissement pour faciliter l'ajustement de l'amortissement:

amortissement flottant public = 1;

Au lieu de faire un lerping entre deux points, comme nous l'avons fait avec la caméra Dungeon, nous allons lerping entre l'angle de la caméra et l'angle de la cible. Ainsi, plutôt que Vector3.Lerp (), nous utilisons la méthode Mathf.LerpAngle (). Nous remplaçons le code d'angle d'origine par:

float currentAngle = transform.eulerAngles.y; float désiréAngle = target.transform.eulerAngles.y; float angle = Mathf.LerpAngle (currentAngle, désiréAngle, Time.deltaTime * amortissement); Quaternion rotation = Quaternion.Euler (0, angle, 0);

Le script final devrait ressembler à ceci:

public class FollowCamera: MonoBehaviour public GameObject target; amortissement flottant public = 1; Vector3 offset; void Start () offset = target.transform.position - transform.position;  void LateUpdate () float currentAngle = transform.eulerAngles.y; float désiréAngle = target.transform.eulerAngles.y; float angle = Mathf.LerpAngle (currentAngle, désiréAngle, Time.deltaTime * amortissement); Quaternion rotation = Quaternion.Euler (0, angle, 0); transform.position = target.transform.position - (rotation * offset); transform.LookAt (target.transform); 

La caméra objectif souris

Ce type de caméra est similaire à la caméra de suivi, sauf que la rotation est contrôlée par la souris, qui pointe ensuite le personnage dans la direction dans laquelle la caméra fait face..

  1. Cliquez sur Actifs> Créer> Script C #.
  2. Nommez le script DungeonCamera
  3. Faites glisser le script DungeonCamera du panneau Projet sur la caméra principale du panneau Hiérarchie.

Comme la caméra Suivante, la caméra à visée de souris aura besoin d'un attribut public pour une cible et une vitesse de rotation, ainsi que d'un décalage. Le décalage doit être défini dans la méthode Start ():

Classe publique MouseAimCamera: MonoBehaviour public GameObject target; float public rotationSpeed ​​= 5; Vector3 offset; void Start () offset = target.transform.position - transform.position; 

On peut accéder à l’axe horizontal de la souris (aka: Mouse X) et l’utiliser pour faire pivoter la cible.

float horizontal = Input.GetAxis ("Souris X") * rotateSpeed; target.transform.Rotate (0, horizontal, 0);

Nous orientons ensuite le décalage dans la même direction et le soustrayons de la position de la cible pour maintenir la caméra derrière la cible..

float désiréAngle = target.transform.eulerAngles.y; Quaternion rotation = Quaternion.Euler (0, désiréAngle, 0); transform.position = target.transform.position - (rotation * offset); transform.LookAt (target.transform);

Faites glisser le lecteur du panneau Hiérarchie vers la propriété Cible du script dans l'inspecteur..

Contrairement aux autres scripts, nous n'allons pas atténuer les mouvements de la caméra. En raison de la nature précise de la souris, elle peut souvent entraîner le mal des transports..

Le script final devrait ressembler à ceci:

Classe publique MouseAimCamera: MonoBehaviour public GameObject target; float public rotationSpeed ​​= 5; Vector3 offset; void Start () offset = target.transform.position - transform.position;  void LateUpdate () float horizontal = Input.GetAxis ("Souris X") * rotateSpeed; target.transform.Rotate (0, horizontal, 0); float désiréAngle = target.transform.eulerAngles.y; Quaternion rotation = Quaternion.Euler (0, désiréAngle, 0); transform.position = target.transform.position - (rotation * offset); transform.LookAt (target.transform); 

Dernières pensées

Plusieurs scripts de caméra peuvent être appliqués simultanément à une seule caméra. Pour basculer entre les différents scripts, activez le script souhaité en le cochant et en décochant tous les autres. Cela peut être utile pour passer à un style de caméra différent pour établir des plans ou des scènes.

Unity est également livré avec plusieurs scripts de caméra que vous pouvez utiliser directement. Les scripts sont bien documentés, faciles à personnaliser et constituent d'excellents guides pour la construction et l'amélioration de vos propres scripts de caméra..

  1. Cliquez sur Actifs> Importer un package> Scripts.
  2. Décocher tout sauf les scripts de caméra

Conclusion

Unity facilite la construction d'une grande variété de caméras pour tout type de jeu. Avec seulement quelques lignes de code, l'élément le plus important de votre jeu est prêt à l'emploi. Bien que certains puissent trouver le calcul un peu intimidant, Unity fournit tellement de fonctions pratiques utiles que la plupart des calculs lourds sont déjà faits pour vous..

Cliquez ici pour télécharger le projet complet Unity.