I. Introduction▲
Cette série explique pas à pas la création d'un contrôleur pour le mouvement d'un personnage dans un jeu de plateformes 2D.
Vous pouvez retrouver les autres épisodes de cette série dans le sommaire dédié.
II. Vidéo▲
Unity - Contrôleur pour personnage d'un jeu de plateformes - Détecter les recouvrements
III. Résumé▲
Dans l'épisode précédent, la caisse traverse le sol. Dans ce tutoriel, vous allez apprendre comment détecter les collisions afin d'éviter ce comportement.
III-A. Détection des recouvrements▲
Lorsqu'une collision est détectée, la vélocité de l'objet doit être modifiée afin d'arrêter son mouvement. Dans notre cas, nous souhaitons n'appliquer la collision que si la distance sur laquelle se déplace l'objet est plus grande qu'un seuil déterminé. De cette façon, nous évitons la vérification des collisions pour les objets qui ne se déplacent plus.
La distance est calculée en utilisant la magnitude de la vélocité :
using
System.
Collections;
using
System.
Collections.
Generic;
using
UnityEngine;
public
class
PhysicsObject :
MonoBehaviour {
public
float
gravityModifier =
1f
;
protected
Rigidbody2D rb2d;
protected
Vector2 velocity;
protected
ContactFilter2D contactFilter;
protected
RaycastHit2D[]
hitBuffer =
new
RaycastHit2D[
16
];
protected
const
float
minMoveDistance =
0
.
001f
;
protected
const
float
shellRadius =
0
.
01f
;
void
OnEnable
(
)
{
rb2d =
GetComponent<
Rigidbody2D>
(
);
}
void
Start (
)
{
contactFilter.
useTriggers =
false
;
contactFilter.
SetLayerMask (
Physics2D.
GetLayerCollisionMask (
gameObject.
layer));
contactFilter.
useLayerMask =
true
;
}
void
Update (
)
{
}
void
FixedUpdate
(
)
{
velocity +=
gravityModifier *
Physics2D.
gravity *
Time.
deltaTime;
Vector2 deltaPosition =
velocity *
Time.
deltaTime;
Vector2 move =
Vector2.
up *
deltaPosition.
y;
Movement (
move);
}
void
Movement
(
Vector2 move)
{
float
distance =
move.
magnitude;
if
(
distance >
minMoveDistance)
{
int
count =
rb2d.
Cast (
move,
contactFilter,
hitBuffer,
distance +
shellRadius);
}
rb2d.
position =
rb2d.
position +
move;
}
}
La fonction RigidBody2D.Cast() permet de détecter si l'objet actuel va entrer en collision avec un autre objet de la scène. De plus, un « ContactFilter2D » est utilisé pour diminuer le nombre de collisions à vérifier grâce au mécanisme des calques (« layers »).
Lors de l'utilisation de la fonction Cast(), la distance est légèrement augmentée pour empêcher que l'objet ne soit bloqué dans le composant avec lequel il entre en collision.
Pour le moment, le script n'est pas utilisable tel quel. En effet, nous n'avons pas écrit le code modifiant la vélocité de l'objet selon les collisions détectées.
IV. Ressources▲
Vous pouvez télécharger les ressources pour ce projet ici.
V. Commenter▲
Vous pouvez commenter et donner vos avis dans la discussion associée sur le forum.