Mohamed Amine MEZGHICH
Ing nieur ENSI
Doctorant en traitement dimage, 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 dun objet charg de
d tecter les collisions avec dautres objets.
d tecter les collisions avec dautres 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
danticiper une collision et deffectuer de nombreuses
autres t ches laide dune technique appel e raycasting.
(cid:1) Nous allons voir en d tail, deux l ments essentiels au
d veloppement dun 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 nimporte quel
moteur de jeu, des informations sur cet v nement
deviennent alors disponibles. En enregistrant diff rentes
informations au moment de limpact, 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 dune 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 lobjet 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 louverture dune 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 naurait gu re de sens de d tecter les collisions
ailleurs, puisque lanimation de la porte doit se d clencher
ailleurs, puisque lanimation de la porte doit se d clencher
lorsque le joueur est assez proche pour esp rer quelle
souvre 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
larr terait net. En outre, bien que vous
puissiez utiliser cette collision pour d clencher lanimation
douverture de la porte, limpact 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 dun point de vue
trop
technique,
dinconv nients pour quun d veloppeur de jeux cr atif ne
l
recherche pas une approche plus intuitive. Cest
quintervient 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 quil soit possible de d tecter les collisions entre le
collider du personnage et un collider qui sadapte lobjet
porte, il semble plus judicieux que la porte souvre lorsque
le joueur lui fait face et une certaine distance, ce qui peut
tre r alis en projetant un rayon dune longueur limit e
depuis lavant du personnage.
depuis lavant du personnage.
(cid:1) Cette m thode garantit galement que le joueur ne peut
pas ouvrir la porte sil lui tourne le dos ; avec le raycasting,
il doit faire face lobjet pour lutiliser, 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 lobjet 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 dimpact, et les utiliser pour d finir la
r action de la cible (faire reculer lennemi 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
Publicité
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 sagit de d clencher louverture et la fermeture de la porte
dune cabane(outpost), cr e avec le logiciel Maya.
dune 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
(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 lavant-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
danimation 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 lavant-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 lavant-poste est
suffisante pour que lobjet Character Controller passe
par la porte et la taille de la pi ce sera r aliste lorsque le
personnage se trouvera lint rieur.
personnage se trouvera lint 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 souvrir lorsquelle entre en
collision avec le joueur.
(cid:1) Pour cela, lobjet doit poss der un composant Collider
(cid:1) Pour cela, lobjet doit poss der un composant Collider
et un tag sp cifique qui d signera lobjet 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 dun mod le lorsque
loption 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 lajout dun nouveau composant entra nera la fin
de la connexion entre cet objet et lobjet 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
Publicité
plus identique la ressource dorigine 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 lop 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 den ajouter un nouveau.Comme nous
navons plus besoin du Mesh Collider, cliquez sur Replace.
Ann e universitaire 2012-2013
18
(cid:1) Le composant Box Collider que vous venez dajouter
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) Lobjet 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 saffiche 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. Cest pourquoi vous avez d sactiv
(idle) lanimation 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 safficher
animations des objets, ceux-ci risquent de safficher
dans un des tats danimation plut t quavec 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
lobjet 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) Lobjet 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 lanimation afin que vous puissiez ensuite
utiliser lune ou lautre 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
(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
Publicité
Ann e universitaire 2012-2013
25
(cid:1) Utiliser OnControllerColliderHit
Par d faut,
tous
les nouveaux scripts
JavaScript
contiennent la fonction Update(), qui saffiche 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 cest le cas ici. Son seul param tre,
hit, est une variable qui stocke des informations lorsquune
collision se produit, notamment lobjet 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(){
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 dun 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);
Publicité
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
lobjet quil 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 lobjet:
Il existe deux m thodes pour attacher un script un objet dans
Unity :
1-faire glisser le script depuis le panneau Project sur lobjet dans
les panneaux Hierarchy ou Scene.
les panneaux Hierarchy ou Scene.
2-s lectionner lobjet 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 laurez 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 lobjet 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 lutilisation 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 lavant-poste sil lui fait
face.
face.
(cid:1) En effet, le rayon part toujours dans la direction vers
laquelle lobjet First Person Controller est tourn , si
bien quil 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 leffet de repoussement qui
survient lors du contact avec le collider invisible de la
porte, s lectionnez lobjet enfant door du composant
porte, s lectionnez lobjet enfant door du composant
Box Collider dans le panneau Inspector, puis donnez
au param tre Size une valeur de 0,1 sur laxe 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 lavant 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