Controlador de personajes 2D para Unity

2D Platformer es un tipo de juego en el que el jugador salta entre plataformas, evita obstáculos y lucha contra enemigos, todo lo cual se observa desde una perspectiva lateral 2D.

Sharp Coder Reproductor de video

Para crear un controlador de personaje de plataformas 2D en Unity, sigue los pasos a continuación.

El controlador estará basado en la física y utilizará un componente Rigidbody2D.

Pasos

  • Abre la escena con tu nivel 2D (asegúrate de que los sprites del nivel tengan colisionadores 2D adjuntos, para que el jugador no se caiga)
  • Crea un nuevo GameObject y llámalo "Player"
  • Crea otro GameObject, llámalo "player_sprite" y agrégale el componente Sprite Renderer.
  • Asigna tu sprite a "player_sprite" y muévelo dentro del objeto "Player"

  • Cree un nuevo script, asígnele el nombre "CharacterController2D" y pegue el siguiente código dentro de él:

CharacterController2D.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);
    }
}
  • Adjunte el script CharacterController2D al objeto "Player" (notará que también agregó otros componentes llamados Rigidbody2D y CapsuleCollider2D)
  • Modifique las dimensiones de CapsuleCollider2D hasta que coincidan con el Sprite del jugador
  • Asegúrese de que no haya colisionadores secundarios y que CapsuleCollider2D sea el único colisionador conectado a este reproductor.

En el script CharacterController2D hay una opción para asignar la variable Cámara principal, que puede ser cualquier cámara que siga al jugador:

¡El controlador de personajes 2D ya está listo!

Artículos sugeridos
Tutorial de salto de pared 3D y 2D de Player para Unity
Agregar soporte de doble salto a un controlador de personajes de plataformas 2D en Unity
Sistema de Diálogo para la Unidad
Tutorial del controlador de jugador de arriba hacia abajo para Unity
Controlador de reproductor RTS y MOBA para Unity
Controlador de helicóptero para Unity
Controlador de coche para Unity