Contrôleur de personnages 2D pour Unity

2D Platformer est un type de jeu dans lequel le joueur saute entre les plates-formes, évite les obstacles et combat les ennemis, le tout étant observé dans une perspective de vue latérale 2D.

Sharp Coder Lecteur vidéo

Pour créer un contrôleur de personnage de plateforme 2D dans Unity, suivez les étapes ci-dessous.

Le contrôleur sera basé sur la physique et utilisera un composant Rigidbody2D.

Pas

  • Ouvrez la scène avec votre niveau 2D (assurez-vous que les sprites de niveau ont des collisionneurs 2D attachés, afin que le joueur ne tombe pas à travers)
  • Créez un nouveau GameObject et appelez-le "Player"
  • Créez un autre GameObject, appelez-le "player_sprite" et ajoutez-y le composant Sprite Renderer
  • Attribuez votre sprite à "player_sprite" et déplacez-le à l'intérieur de l'objet "Player"

  • Créez un nouveau script, nommez-le "CharacterController2D" et collez-y le code ci-dessous:

CaractèreController2D.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[RequireComponent(typeof(Rigidbody2D))]
[RequireComponent(typeof(CapsuleCollider2D))]

public class CharacterController2D : MonoBehaviour
{
    // Move player in 2D space
    public float maxSpeed = 3.4f;
    public float jumpHeight = 6.5f;
    public float gravityScale = 1.5f;
    public Camera mainCamera;

    bool facingRight = true;
    float moveDirection = 0;
    bool isGrounded = false;
    Vector3 cameraPos;
    Rigidbody2D r2d;
    CapsuleCollider2D mainCollider;
    Transform t;

    // Use this for initialization
    void Start()
    {
        t = transform;
        r2d = GetComponent<Rigidbody2D>();
        mainCollider = GetComponent<CapsuleCollider2D>();
        r2d.freezeRotation = true;
        r2d.collisionDetectionMode = CollisionDetectionMode2D.Continuous;
        r2d.gravityScale = gravityScale;
        facingRight = t.localScale.x > 0;

        if (mainCamera)
        {
            cameraPos = mainCamera.transform.position;
        }
    }

    // Update is called once per frame
    void Update()
    {
        // Movement controls
        if ((Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.D)) && (isGrounded || Mathf.Abs(r2d.velocity.x) > 0.01f))
        {
            moveDirection = Input.GetKey(KeyCode.A) ? -1 : 1;
        }
        else
        {
            if (isGrounded || r2d.velocity.magnitude < 0.01f)
            {
                moveDirection = 0;
            }
        }

        // Change facing direction
        if (moveDirection != 0)
        {
            if (moveDirection > 0 && !facingRight)
            {
                facingRight = true;
                t.localScale = new Vector3(Mathf.Abs(t.localScale.x), t.localScale.y, transform.localScale.z);
            }
            if (moveDirection < 0 && facingRight)
            {
                facingRight = false;
                t.localScale = new Vector3(-Mathf.Abs(t.localScale.x), t.localScale.y, t.localScale.z);
            }
        }

        // Jumping
        if (Input.GetKeyDown(KeyCode.W) && isGrounded)
        {
            r2d.velocity = new Vector2(r2d.velocity.x, jumpHeight);
        }

        // Camera follow
        if (mainCamera)
        {
            mainCamera.transform.position = new Vector3(t.position.x, cameraPos.y, cameraPos.z);
        }
    }

    void FixedUpdate()
    {
        Bounds colliderBounds = mainCollider.bounds;
        float colliderRadius = mainCollider.size.x * 0.4f * Mathf.Abs(transform.localScale.x);
        Vector3 groundCheckPos = colliderBounds.min + new Vector3(colliderBounds.size.x * 0.5f, colliderRadius * 0.9f, 0);
        // Check if player is grounded
        Collider2D[] colliders = Physics2D.OverlapCircleAll(groundCheckPos, colliderRadius);
        //Check if any of the overlapping colliders are not player collider, if so, set isGrounded to true
        isGrounded = false;
        if (colliders.Length > 0)
        {
            for (int i = 0; i < colliders.Length; i++)
            {
                if (colliders[i] != mainCollider)
                {
                    isGrounded = true;
                    break;
                }
            }
        }

        // Apply movement velocity
        r2d.velocity = new Vector2((moveDirection) * maxSpeed, r2d.velocity.y);

        // Simple debug
        Debug.DrawLine(groundCheckPos, groundCheckPos - new Vector3(0, colliderRadius, 0), isGrounded ? Color.green : Color.red);
        Debug.DrawLine(groundCheckPos, groundCheckPos - new Vector3(colliderRadius, 0, 0), isGrounded ? Color.green : Color.red);
    }
}
  • Attachez le script CharacterController2D à l'objet "Player" (vous remarquerez qu'il a également ajouté d'autres composants appelés Rigidbody2D et CapsuleCollider2D)
  • Ajustez les dimensions de CapsuleCollider2D jusqu'à ce qu'elles correspondent au Sprite du lecteur
  • Assurez-vous qu'il n'y a pas de collisionneurs enfants et que CapsuleCollider2D est le seul collisionneur attaché à ce lecteur.

Dans le script CharacterController2D, il existe une option pour attribuer la variable Caméra principale qui peut être n'importe quelle caméra qui suivra le joueur:

Le contrôleur de personnages 2D est maintenant prêt !

Articles suggérés
Tutoriel Player 3D et 2D Wall Jump pour Unity
Ajout de la prise en charge du double saut à un contrôleur de personnage de plateforme 2D dans Unity
Contrôleur de lecteur RTS et MOBA pour Unity
Contrôleur d'avion pour Unity
Tutoriel sur le contrôleur de ver 3D pour Unity
Contrôleur de lecteur planétaire basé sur Rigidbody pour Unity
Tutoriel de contrôleur de lecteur descendant pour Unity