Menu
CoddyTech

Pousser des objets

Fait partie de la section Créer de vrais jeux du Journey Unity de Coddy. Leçon 40 sur 56.

Un CharacterController ne pousse jamais rien : fais-le avancer contre une caisse avec un Rigidbody et il s’arrête comme devant un mur. À la place, Unity appelle OnControllerColliderHit(ControllerColliderHit hit) sur les scripts propres au contrôleur pour chaque collider touché par un Move, y compris le sol, et le script décide de ce qui se passe. hit.collider est ce qui a été touché, hit.moveDirection est la direction du Move qui l’a touché, et hit.normal est la direction vers laquelle sa surface est orientée au point de contact. Voici le script de poussée de Unity :

public float pushPower = 2f;

void OnControllerColliderHit(ControllerColliderHit hit)
{
    Rigidbody body = hit.collider.attachedRigidbody;
    if (body == null || body.isKinematic) return;   // rien à pousser
    if (hit.moveDirection.y < -0.3f) return;        // il se trouve sous nos pieds

    Vector3 pushDir = new Vector3(hit.moveDirection.x, 0f, hit.moveDirection.z);
    body.linearVelocity = pushDir * pushPower;
}

Chaque return a une raison. Le sol et les murs n’ont pas de Rigidbody, donc body est null pour eux, et ils sont touchés lors de presque chaque Move. Un corps cinématique ne se déplace que lorsque son propre script le déplace, donc une vélocité ne lui fait rien. Un Move orienté fortement vers le bas a touché quelque chose sous les pieds, et la caisse sur laquelle le joueur se tient ne doit pas être poussée.

La direction de poussée ne conserve que x et z, de sorte qu’une caisse glisse sur le sol au lieu d’être enfoncée dedans. Définir linearVelocity, au lieu d’ajouter une force, déplace une caisse légère et une caisse lourde au même rythme ; body.AddForce(pushDir * pushPower, ForceMode.Impulse) pousserait moins la caisse lourde.

challenge icon

Défi

Moyen

Fais rouler les ballons dans le jardin. Le joueur se déplace avec un CharacterController (Walker.cs, déjà prêt). Écris Kicker.cs, également sur le joueur. Dans l’Inspector, définis kickPower (6) et lift (4).

  • Lorsque le joueur marche contre un objet qui peut être poussé, définis sa linearVelocity dans la direction de la marche, à plat le long du sol, multipliée par kickPower, puis ajoute lift vers le haut, afin que le ballon parte vers l’avant et vers le haut.
  • Le sol et le poteau n’ont pas de Rigidbody : ignore-les sans erreur.
  • Un ballon sous les pieds du joueur ne doit pas être frappé.

Appuie sur Play et frappe le ballon rouge, puis sur Check.

Essayez vous-même

using UnityEngine;

public class Kicker : MonoBehaviour
{
    public float kickPower = 6f;
    public float lift = 4f;

    // Donner un coup de pied aux balles que le joueur touche en marchant
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Créer de vrais jeux