Mohamed Amine MEZGHICH Ingénieur ENSI Doctorant en traitement d’image, Lab. CRISTAL,ENSI E-mail:[email protected]
Cycle Ingénieur
Année universitaire 2012-2013
1
(cid:1) Pour détecter les interactions physiques entre les objets de jeu, la méthode la plus courante consiste à utiliser un collider – un filet invisible tout autour d’un objet chargé de détecter les collisions avec d’autres objets. détecter les collisions avec d’autres objets.
(cid:1) La détection de collision regroupe à la fois la détection
et la récupération des informations provenant de ces collisions.
Année universitaire 2012-2013
2
i i
M M o o h h a a m m e e d d A A m m n n e e M M E E Z Z G G H H I I C C H H
(cid:1) Il est non seulement possible de détecter que deux colliders (composants de collision) interagissent, mais également d’anticiper une collision et d’effectuer de nombreuses autres tâches à l’aide d’une technique appelée raycasting.
(cid:1) Nous allons voir en détail, deux éléments essentiels au développement d’un jeu : la détection de collision et le raycasting(tracé de rayon).
i i
M M o o h h a a m m e e d d A A m m n n e e M M E E Z Z G G H H I I C C H H
Année universitaire 2012-2013
3
(cid:1) Lorsque des objets entrent en collision dans n’importe quel moteur de jeu, des informations sur cet événement deviennent alors disponibles. En enregistrant différentes informations au moment de l’impact, le moteur de jeu peut ensuite réagir de manière réaliste.
(cid:1) Dans un jeu tenant compte des lois physiques par exemple, si un objet tombe au sol d’une certaine hauteur, le moteur a besoin de savoir quelle partie de cet objet touche le sol en premier pour contrôler de façon correcte et réaliste la réaction de l’objet à cet impact.
i i
M M o o h h a a m m e e d d A A m m n n e e M M E E Z Z G G H H I I C C H H
Année universitaire 2012-2013
4
(cid:1) Dans le cas de l’ouverture d’une porte, vous avez besoin de détecter les collisions entre le collider du personnage du joueur et celui situé sur – ou près de – la porte.
(cid:1) Cela n’aurait guère de sens de détecter les collisions ailleurs, puisque l’animation de la porte doit se déclencher ailleurs, puisque l’animation de la porte doit se déclencher lorsque le joueur est assez proche pour espérer qu’elle s’ouvre ou pour franchir le seuil.
(cid:1) Par conséquent, vous allez vérifier les collisions entre le collider du personnage et celui de la porte. Vous devez toutefois étendre la profondeur du collider de la porte
i i
M M o o h h a a m m e e d d A A m m n n e e M M E E Z Z G G H H I I C C H H
Année universitaire 2012-2013
5
i i
M M o o h h a a m m e e d d A A m m n n e e M M E E Z Z G G H H I I C C H H
Année universitaire 2012-2013
6
(cid:1) Si le collider de la porte dépassait de la surface visuelle de la porte, le personnage entrerait en collision avec une surface invisible qui l’arrêterait net. En outre, bien que vous puissiez utiliser cette collision pour déclencher l’animation d’ouverture de la porte, l’impact initial dans le collider semblerait peu naturel pour le joueur, ce qui nuirait à on immersion dans le jeu. immersion dans le jeu.
(cid:1) Si la détection de collision fonctionne très bien entre le collider du personnage et celui de la porte d’un point de vue trop technique, d’inconvénients pour qu’un développeur de jeux créatif ne là recherche pas une approche plus intuitive. C’est qu’intervient le raycasting.
approche
présente
donc
cette
Année universitaire 2012-2013
7
i i
M M o o h h a a m m e e d d A A m m n n e e M M E E Z Z G G H H I I C C H H
(cid:1) Bien qu’il soit possible de détecter les collisions entre le collider du personnage et un collider qui s’adapte à l’objet porte, il semble plus judicieux que la porte s’ouvre lorsque le joueur lui fait face et à une certaine distance, ce qui peut être réalisé en projetant un rayon d’une longueur limitée depuis l’avant du personnage. depuis l’avant du personnage.
(cid:1) Cette méthode garantit également que le joueur ne peut pas ouvrir la porte s’il lui tourne le dos ; avec le raycasting, il doit faire face à l’objet pour l’utiliser, ce qui est plus logique.
i i
M M o o h h a a m m e e d d A A m m n n e e M M E E Z Z G G H H I I C C H H
Année universitaire 2012-2013
8
(cid:1) Dans le raycasting, un rayon est tracé dans la direction visée. Il est alors possible de récupérer de informations sur le collider que ce rayon touche. Une fois le collider identifié, un script peut alors désigner l’objet de jeu lui- même et scénariser son comportement en conséquence.
(cid:1) Vous pouvez obtenir des informations très détaillées, comme le point d’impact, et les utiliser pour définir la réaction de la cible (faire reculer l’ennemi dans une direction particulière par exemple).
i i
M M o o h h a a m m e e d d A A m m n n e e M M E E Z Z G G H H I I C C H H
Année universitaire 2012-2013
9
i i
M M o o h h a a m m e e d d A A m m n n e e M M E E Z Z G G H H I I C C H H
Année universitaire 2012-2013
10
(cid:1) Dans ce qui reste, nous allons illustrer les deux mécanismes
de détection de collisions sur un exemple.
(cid:1) Il s’agit de déclencher l’ouverture et la fermeture de la porte
d’une cabane(outpost), créée avec le logiciel Maya. d’une cabane(outpost), créée avec le logiciel Maya.
(cid:1) Trois animations(Idle, ouverture, fermeture) sont attachées
à la porte.
i i
M M o o h h a a m m e e d d A A m m n n e e M M E E Z Z G G H H I I C C H H
(cid:1) Les mécanismes de détection de collisions vont nous
permettre de déclencher ces animations.
Année universitaire 2012-2013
11
Publicité
(cid:1) Avant de commencer à utiliser à la fois la détection de la porte, vous
collision et le raycasting pour ouvrir devez intégrer à la scène l’avant-poste(Cabane).
(cid:1) Plus loin, vous écrirez le script qui contrôle les états (cid:1) Plus loin, vous écrirez le script qui contrôle les états
d’animation de ce modèle.
i i
M M o o h h a a m m e e d d A A m m n n e e M M E E Z Z G G H H I I C C H H
(cid:1) Une fois l’avant-poste dans le panneau Scene, son nom il est
le panneau Hierarchy et
apparaît dans automatiquement sélectionné.
Année universitaire 2012-2013
12
i i
M M o o h h a a m m e e d d A A m m n n e e M M E E Z Z G G H H I I C C H H
Année universitaire 2012-2013
13
(cid:1) Modifiez la valeur Scale Factor de 1 à 2, puis cliquez sur le bouton Apply. Ainsi, la taille de l’avant-poste est suffisante pour que l’objet Character Controller passe par la porte et la taille de la pièce sera réaliste lorsque le personnage se trouvera à l’intérieur. personnage se trouvera à l’intérieur.
i i
M M o o h h a a m m e e d d A A m m n n e e M M E E Z Z G G H H I I C C H H
Année universitaire 2012-2013
14
(cid:1) La porte doit être identifiée comme un objet particulier pour pouvoir s’ouvrir lorsqu’elle entre en collision avec le joueur.
(cid:1) Pour cela, l’objet doit posséder un composant Collider (cid:1) Pour cela, l’objet doit posséder un composant Collider et un tag spécifique qui désignera l’objet dans le script.
i i
M M o o h h a a m m e e d d A A m m n n e e M M E E Z Z G G H H I I C C H H
(cid:1) Le Collider Mesh Collider est assigné à tous les maillages des objets enfants d’un modèle lorsque l’option Generate Colliders est activée.
Année universitaire 2012-2013
15
i i
M M o o h h a a m m e e d d A A m m n n e e M M E E Z Z G G H H I I C C H H
Année universitaire 2012-2013
16
(cid:1) Vous devez le remplacer par un collider plus simple et
plus efficace en forme de boîte.
(cid:1) Cliquez sur Component > Physics > Box Collider dans
le menu principal. le menu principal.
(cid:1) Une première boîte de dialogue, Losing Prefab, signale que l’ajout d’un nouveau composant entraînera la fin de la connexion entre cet objet et l’objet parent dans le panneau Project.
i i
M M o o h h a a m m e e d d A A m m n n e e M M E E Z Z G G H H I I C C H H
Année universitaire 2012-2013
17
(cid:1) Autrement dit, la copie placée dans le panneau Scene ne sera plus identique à la ressource d’origine et toute modification apportée à la ressource dans le panneau Project ne sera pas répercutée sur cette copie. Cliquez simplement sur le bouton Add pour confirmer.
(cid:1) Une seconde boîte de dialogue apparaît dans laquelle vous indiquez si vous voulez ajouter ce collider à votre objet (Add), le remplacer (Replace) ou annuler l’opération (Cancel).
i i
M M o o h h a a m m e e d d A A m m n n e e M M E E Z Z G G H H I I C C H H
(cid:1) le programme vous demande si vous souhaitez remplacer celui qui existe plutôt que d’en ajouter un nouveau.Comme nous n’avons plus besoin du Mesh Collider, cliquez sur Replace.
Année universitaire 2012-2013
18
(cid:1) Le composant Box Collider que vous venez d’ajouter apparaît alors autour de la porte, figuré par un contour vert.
i i
M M o o h h a a m m e e d d A A m m n n e e M M E E Z Z G G H H I I C C H H
Année universitaire 2012-2013
19
(cid:1) L’objet enfant door étant toujours sélectionné, cliquez sur le menu déroulant Tag situé en haut du panneau Inspector, puis choisissez Add Tag. Ajoutez le tag outpostDoor dans le Tag Manager qui s’affiche dans le panneau Inspector. le panneau Inspector.
i i
M M o o h h a a m m e e d d A A m m n n e e M M E E Z Z G G H H I I C C H H
Année universitaire 2012-2013
20
(cid:1) Par défaut, Unity suppose que toutes les animations des objets placés sur la scène doivent être lues automatiquement. C’est pourquoi vous avez désactivé (idle) l’animation de cette ressource. (cid:1) Si vous laissez Unity lancer automatiquement les Si vous laissez Unity lancer automatiquement les animations des objets, ceux-ci risquent de s’afficher animations des objets, ceux-ci risquent de s’afficher dans un des états d’animation plutôt qu’avec leur apparence par défaut.
(cid:1) Pour corriger ce problème, il suffit de décocher la case Play automatically dans le panneau Inspector pour l’objet parent du modèle.
i i
M M o o h h a a m m e e d d A A m m n n e e M M E E Z Z G G H H I I C C H H
Année universitaire 2012-2013
21
(cid:1) L’objet outpost est maintenant prêt à interagir avec le personnage du joueur. Vous allez donc commencer à écrire les scripts pour gérer les collisions avec la porte, en utilisant soit la détection de collision soit le raycasting.
i i
M M o o h h a a m m e e d d A A m m n n e e M M E E Z Z G G H H I I C C H H
Année universitaire 2012-2013
22
(cid:1) Nous allons étudier les deux méthodes permettant de déclencher l’animation afin que vous puissiez ensuite utiliser l’une ou l’autre lors du développement de vos jeux en fonction de la situation.
(cid:1) Dans un premier temps, vous utiliserez la détection de (cid:1) Dans un premier temps, vous utiliserez la détection de collision – une notion essentielle à connaître lorsque vous commencez à travailler sur des jeux dans Unity.
i i
M M o o h h a a m m e e d d A A m m n n e e M M E E Z Z G G H H I I C C H H
Publicité
(cid:1) Puis dans un second temps,
implémenterez simplement une projection de rayon depuis le personnage du joueur.
vous
Année universitaire 2012-2013
23
(cid:1) Lors du développement de jeux, il est souvent plus efficace d’écrire un seul script pour un objet qui interagira avec plusieurs autres objets, plutôt que d’écrire de nombreux scripts pour chacun des objets afin de vérifier que ceux-ci entrent en collision avec un objet en particulier. objet en particulier.
(cid:1) Pour un jeu comme celui-ci, vous allez donc écrire un script à appliquer au personnage du joueur et non un script pour chaque objet avec lequel le joueur peut interagir.
i i
M M o o h h a a m m e e d d A A m m n n e e M M E E Z Z G G H H I I C C H H
Année universitaire 2012-2013
24
(cid:1) Créer un nouveau répertoire dans le projet, nommer ce
répertoire (Folder)Scripts
(cid:1) Sélectionner ce répertoire et créer un nouveau fichier
javascript
(cid:1) Nommer ce fichier(F2)en PlayerCollisions (cid:1) Nommer ce fichier(F2)en PlayerCollisions
i i
M M o o h h a a m m e e d d A A m m n n e e M M E E Z Z G G H H I I C C H H
Année universitaire 2012-2013
25
(cid:1) Utiliser OnControllerColliderHit Par défaut,
tous
les nouveaux scripts
JavaScript contiennent la fonction Update(), qui s’affiche lorsque fois. Pour vous commencer, vous allez déclarer les variables que vous commencer, vous allez déclarer les variables que vous utiliserez.
les ouvrez pour
la première
i i
M M o o h h a a m m e e d d A A m m n n e e M M E E Z Z G G H H I I C C H H
Pour définir ces variables, ajoutez les lignes suivantes au tout début du script PlayerCollisions que vous modifiez
Année universitaire 2012-2013
26
(cid:1) Utiliser OnControllerColliderHit
private var doorIsOpen : boolean = false; private var doorTimer : float = 0.0; private var currentDoor : GameObject;
var doorOpenTime : float = 3.0;
var doorOpenSound : AudioClip; var doorShutSound : AudioClip;
i i
M M o o h h a a m m e e d d A A m m n n e e M M E E Z Z G G H H I I C C H H
Année universitaire 2012-2013
27
(cid:1) Utiliser OnControllerColliderHit Et ajoutez la fonction suivante:
function OnControllerColliderHit(hit : ControllerColliderHit){ }
(cid:1) Cette
de
collision,
détection
appelée fonction OnControllerColliderHit, aux personnages composant jouables CharacterController, comme c’est le cas ici. Son seul paramètre, hit, est une variable qui stocke des informations lorsqu’une collision se produit, notamment l’objet de jeu avec lequel le joueur est entré en collision.
de spécialement utilisent
est qui
destinée
le
i i
M M o o h h a a m m e e d d A A m m n n e e M M E E Z Z G G H H I I C C H H
Année universitaire 2012-2013
28
La fonction de collision complète doit maintenant être semblable à celle-ci : function OnControllerColliderHit(hit: ControllerColliderHit){
if(hit.gameObject.tag == "outpostDoor" && doorIsOpen == false){
OpenDoor(); }
} } La fonction personnalisée OpenDoor() complète doit être analogue à ceci: function OpenDoor(){
audio.PlayOneShot(doorOpenSound); doorIsOpen = true; var myOutpost : GameObject = GameObject.Find("outpost"); myOutpost.animation.Play("dooropen"); }
i i
M M o o h h a a m m e e d d A A m m n n e e M M E E Z Z G G H H I I C C H H
Année universitaire 2012-2013
29
(cid:1) function Update(){ if(doorIsOpen){
doorTimer += Time.deltaTime; if(doorTimer > 3){ shutDoor(); doorTimer = 0.0; }
}
}
i i
M M o o h h a a m m e e d d A A m m n n e e M M E E Z Z G G H H I I C C H H
Année universitaire 2012-2013
30
(cid:1) function shutDoor(){
Publicité
audio.PlayOneShot(doorShutSound); doorIsOpen = false; var myOutpost : GameObject = GameObject.Find("outpost"); GameObject.Find("outpost"); myOutpost.animation.Play("doorshut");
i i
M M o o h h a a m m e e d d A A m m n n e e M M E E Z Z G G H H I I C C H H
}
Année universitaire 2012-2013
31
(cid:1) Pour
le moment, vous disposez de deux fonctions personnalisées, OpenDoor() shutDoor(), qui effectuent les trois mêmes tâches : elles lancent la lecture d’un son, définissent une variable booléenne et déclenchent une animation. déclenchent une animation.
et
(cid:1) Pourquoi ne pas alors créer une seule fonction qui soit capable de jouer différents sons, de définir si la variable booléenne est true ou false et de lire les différentes animations ?
Année universitaire 2012-2013
32
i i
M M o o h h a a m m e e d d A A m m n n e e M M E E Z Z G G H H I I C C H H
(cid:1) function Door(aClip : AudioClip, openCheck : boolean,
animName : String,thisDoor : GameObject){
audio.PlayOneShot(aClip); doorIsOpen = openCheck; doorIsOpen = openCheck;
thisDoor.transform.parent.animation.Play(animName);
} (cid:1) Pour ouvrir la porte, par exemple, vous pourriez appeler cette fonction et définir chaque paramètre de la façon suivante : Door(doorOpenSound, true, "dooropen", currentDoor);
i i
M M o o h h a a m m e e d d A A m m n n e e M M E E Z Z G G H H I I C C H H
Année universitaire 2012-2013
33
(cid:1) Finaliser le script Pour compléter le script, vous allez vous assurer que l’objet qu’il ajoute possède un composant Audio Source, ce qui est nécessaire pour lire les extraits Source, ce qui est nécessaire pour lire les extraits sonores puisque votre fonction Door déclenche du son.
Ajoutez la ligne suivante tout en bas du script, en vous assurant que la ligne NE se termine PAS par un point- virgule. @script RequireComponent(AudioSource)
i i
M M o o h h a a m m e e d d A A m m n n e e M M E E Z Z G G H H I I C C H H
Année universitaire 2012-2013
34
(cid:1) Attacher le script à l’objet: Il existe deux méthodes pour attacher un script à un objet dans
Unity :
1-faire glisser le script depuis le panneau Project sur l’objet dans les panneaux Hierarchy ou Scene. les panneaux Hierarchy ou Scene.
2-sélectionner l’objet puis cliquer sur Component > Scripts > PlayerCollisions dans le menu principal de Unity.
Remarque: Le sous-menu Scripts du menu Component contient la liste de tous les scripts disponibles dans le panneau Project : il affichera le vôtre dès que vous l’aurez créé et sauvegardé.
i i
M M o o h h a a m m e e d d A A m m n n e e M M E E Z Z G G H H I I C C H H
Année universitaire 2012-2013
35
Pour entrer en collision avec l’objet Door, nous devons
augmenter la valeur Z du Box Collider.
i i
M M o o h h a a m m e e d d A A m m n n e e M M E E Z Z G G H H I I C C H H
Année universitaire 2012-2013
36
(cid:1) Bien que l’utilisation de la détection de collision ou de déclencheur soit une méthode tout à fait valable, le raycasting vous permet de vous assurer que le joueur ouvre seulement la porte de l’avant-poste s’il lui fait face. face.
(cid:1) En effet, le rayon part toujours dans la direction vers laquelle l’objet First Person Controller est tourné, si bien qu’il ne coupera pas la porte si le joueur lui tourne le dos, par exemple.
Année universitaire 2012-2013
37
i i
M M o o h h a a m m e e d d A A m m n n e e M M E E Z Z G G H H I I C C H H
(cid:1) Réinitialiser le collider de la porte Comme vous voulez éviter l’effet de repoussement qui survient lors du contact avec le collider invisible de la porte, sélectionnez l’objet enfant door du composant porte, sélectionnez l’objet enfant door du composant Box Collider dans le panneau Inspector, puis donnez au paramètre Size une valeur de 0,1 sur l’axe Z.
i i
M M o o h h a a m m e e d d A A m m n n e e M M E E Z Z G G H H I I C C H H
(cid:1) Cela correspond à la profondeur visuelle de la porte.
Année universitaire 2012-2013
38
(cid:1) Ajouter le rayon Le raycasting est placé dans la fonction Update() pour la simple M M o o h h raison que le rayon doit être projeté vers l’avant à chaque a a m m image. e e d d A A m m n n e e M M E E Z Z G G H H I I C C H H
var hit : RaycastHit; var hit : RaycastHit; if(Physics.Raycast (transform.position, transform.forward, hit, 5)) { if(hit.collider.gameObject.tag=="outpostDoor" && doorIsOpen ==
i i
false){
currentDoor = hit.collider.gameObject; Door(doorOpenSound, true, "dooropen", currentDoor); } }
Année universitaire 2012-2013
39
(cid:1) Ajouter le rayon
var hit : RaycastHit; if(Physics.Raycast (transform.position, transform.forward,
hit, 5))
transform.position: Le point d’émission du rayon transform.forward: La direction du rayon hit: La structure des données 5: La longueur du rayon
i i
M M o o h h a a m m e e d d A A m m n n e e M M E E Z Z G G H H I I C C H H
Année universitaire 2012-2013
40