[Part2] Ajouter un équipement à un modèle animé

Cet article est la suite de l’animation d’un modèle vous proposant d’utiliser une animation avec un modèle.

Vous devriez pouvoir faire cet article avec à peu près n’importe quels modèle et animation dessus.

Bon, commençons par sélectionner une arme qu’on va équiper à notre modèle, et supprimons une éventuelle animation dessus.

Le but étant de placer notre arme dans la main de notre modèle, en la glissant dans le point de référence du squelette. Et de remettre à 0 la position et la rotation de l’arme.

On va cependant quand même devoir corriger légèrement la position pour la placer correctement dans la main.

Et voilà, vous avez une arme qui suit vos animations !

Un peu trop simple non ?

 

Hé bien non. Cette technique fonctionne pour les modèles statiques. Cependant si vous voulez pouvoir changer d’arme dynamiquement on ne peut pas se permettre de bloquer notre arme dans la main ainsi.

Équipement dynamique

On va devoir créer une ancre dans la main, et depuis notre code on pourra changer l’arme équipée.

Pour ce faire, on va ajouter un cube qui sera notre ancre ou notre repère au niveau de la main du modèle. On n’aura pas besoin du Mesh Renderer et du Box Collider par la suite (qui sont de base dans un cube 3d). Le premier Mesh Renderer nous sert uniquement pour être visible et permettre de placer le cube précisément. Cependant une fois placé, on ne veut pas que le cube soit visible en jeu. Le Box Collider nous permet de détecter une collision avec d’autres modèles ou zone de trigger. Pour ce cube, on n’en a donc pas besoin.

La seule utilité du cube étant qu’il est l’enfant de la main du modèle et donc va suivre tous ses mouvements, et son centre à partir duquel on va placer nos objets.

Pour la suite, on peut enlever l’arme et bien la séparer du modèle.

On doit pouvoir ajouter notre script qui permettra d’équiper notre arme à notre modèle. Pour ce faire, on peut créer un script EquipItemScript directement sur le premier nœud.

Avec le script suivant :

using UnityEngine;

public class EquipItemScript : MonoBehaviour {
 public GameObject HookRightHand;

 void Start()
 {
 // On aurait pu créer un GameObject directement, mais pour l’exemple, on va récupérer celui dans la scène
 var weapon = GameObject.Find("dagger");
 // Et on l’équipe
 EquipRIghtHandWidth(weapon);
 }

 public void EquipRIghtHandWidth(GameObject weapon)
 {
 // On place notre arme en tant que fils de notre repère de la main droite
 weapon.transform.parent = HookRightHand.transform;

 // On place notre arme à partir des positions 0,0,0 au cas où le prefab avait des valeurs.
 weapon.transform.localPosition = Vector3.zero;
 // Remet à 0 les rotations de l'arme
 weapon.transform.localRotation = Quaternion.identity;
 }
}

La variable HookRightHand étant faite pour notre cube de repère, on doit la spécifier depuis l’éditeur.

Et voilà, on a ajouté notre arme dynamiquement

Il reste cependant un problème, l’arme n’est pas très bien placée.

Correction au cas par cas

Il y a plusieurs moyens de corriger ce problème, mais le plus propre d’après moi serait d’ajouter un composant sur notre arme pour spécifier un décalage de correction. L’avantage étant que chaque objet que vous voudrez équiper aura un décalage différent, on pourra ainsi rester assez fin sur les corrections.

Un simple script HookScript sur notre arme fera l’affaire

Avec comme script :

Avec le script suivant :

using UnityEngine;

public class HookScript : MonoBehaviour {
 // Décalage à appliquer à l’arme quand on cherchera à l’ajouter à notre modèle
 public Vector3 positionOffset;
}

On va changer le script pour équiper l’arme, pour prendre en compte ce décalage de cette manière

using UnityEngine;

public class EquipItemScript : MonoBehaviour {

 public GameObject HookRightHand;

 void Start()
 {
 // On aurait pu créer un GameObject directement, mais pour l’exemple, on va récupérer celui dans la scène
 var weapon = GameObject.Find("dagger");
 // Et on l’équipe
 EquipRightHandWidth(weapon);
 }

 public void EquipRightHandWidth(GameObject weapon)
 {
 // On place notre arme en tant que fils de notre repère de la main droite
 weapon.transform.parent = HookRightHand.transform;

 // On récpuère les données de placement spécifique à notre arme
 Vector3 offset = weapon.GetComponent<HookScript>().positionOffset;
 // On place notre arme à partir des positions 0,0,0 au cas où le prefab avait des valeurs et l’offset de placement.
 weapon.transform.localPosition = Vector3.zero + offset;
 // Remet à 0 les rotations de l'arme
 weapon.transform.localRotation = Quaternion.identity;
 }
}

Encore, un dernier effort, il faut trouver quel est le décalage à appliquer, pour ce faire, je vous conseille de lancer le jeu, et de chercher la valeur.

Une fois la valeur obtenue, on va pouvoir l’appliquer à notre composant sur l’arme.

Et voilà !

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *