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.
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 !