2D-tekencontroller voor Unity

2D Platformer is een soort spel waarbij de speler tussen platforms springt, obstakels ontwijkt en tegen vijanden vecht, dit alles vanuit een 2D zijaanzichtperspectief.

Sharp Coder Video speler

Volg de onderstaande stappen om een ​​2D-platformgame-personagecontroller te maken in Unity.

De controller zal op fysica gebaseerd zijn en een Rigidbody2D-component gebruiken.

Stappen

  • Open een scène met je 2D-niveau (zorg ervoor dat de level-sprites 2D-colliders hebben, zodat de speler er niet doorheen valt)
  • Maak een nieuw GameObject en roep het aan "Player"
  • Maak nog een GameObject, noem het "player_sprite" en voeg de Sprite Renderer-component eraan toe
  • Wijs uw sprite toe aan "player_sprite" en verplaats deze binnen het "Player" object

  • Maak een nieuw script, noem het "CharacterController2D" en plak de onderstaande code erin:

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);
    }
}
  • Voeg het CharacterController2D-script toe aan het "Player"-object (je zult merken dat het ook andere componenten heeft toegevoegd, genaamd Rigidbody2D en CapsuleCollider2D)
  • Pas de afmetingen van CapsuleCollider2D aan totdat ze overeenkomen met de speler-Sprite
  • Zorg ervoor dat er geen kinderbotsers zijn en dat de CapsuleCollider2D de enige botser is die aan deze speler is gekoppeld

In het CharacterController2D-script is er een optie om de Main Camera-variabele toe te wijzen. Dit kan elke camera zijn die de speler volgt:

De 2D Character Controller is nu klaar!

Voorgestelde artikelen
Speler 3D- en 2D-muursprong-tutorial voor Unity
Ondersteuning voor dubbele sprongen toegevoegd aan een 2D-platformgame-personagecontroller in Unity
Helikoptercontroller voor Unity
Autocontroller voor Unity
Vliegtuigcontroller voor Unity
Dialoogsysteem voor eenheid
3D-wormcontroller-tutorial voor Unity