Unity için 2D Karakter Kontrol Cihazı

2D Platformer, oyuncunun platformlar arasında atladığı, engellerden kaçındığı ve düşmanlarla savaştığı bir oyun türüdür ve bunların tümü 2 boyutlu yandan görünüm perspektifinden gözlemlenir.

Sharp Coder Video oynatıcı

Unity'te 2D Platformer Karakter Kontrol Cihazı yapmak için aşağıdaki adımları izleyin.

Denetleyici fizik tabanlı olacak ve bir Rigidbody2D bileşeni kullanacak.

Adımlar

  • 2B seviyenizle Sahneyi açın (seviye spritelarında 2B çarpıştırıcıların takılı olduğundan emin olun, böylece oyuncu düşmez)
  • Yeni bir GameObject oluşturun ve onu çağırın "Player"
  • Başka bir GameObject oluşturun, onu "player_sprite" olarak adlandırın ve Sprite Renderer bileşenini ona ekleyin
  • Karakterinizi "player_sprite"'ye atayın ve onu "Player" Nesnesinin içine taşıyın

  • yeni bir komut dosyası oluşturun, onu "CharacterController2D" olarak adlandırın ve içine aşağıdaki kodu yapıştırın:

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);
    }
}
  • CharacterController2D betiğini "Player" Nesnesine ekleyin (Rigidbody2D ve CapsuleCollider2D adı verilen diğer bileşenleri de eklediğini fark edeceksiniz)
  • CapsuleCollider2D boyutlarını oyuncu Sprite'ıyla eşleşene kadar ayarlayın
  • Hiçbir alt çarpıştırıcının olmadığından ve CapsuleCollider2D'nin bu oynatıcıya bağlı tek çarpıştırıcı olduğundan emin olun.

CharacterController2D komut dosyasında, oynatıcıyı takip edecek herhangi bir Kamera olabilecek Ana Kamera değişkenini atama seçeneği vardır:

2D Karakter Kontrol Cihazı artık hazır!

Önerilen Makaleler
Unity için Oyuncu 3D ve 2D Duvardan Atlama Eğitimi
Unity'de 2D Platformer Karakter Denetleyicisine Double Jump Desteği Ekleme
Unity için Araç Kontrol Cihazı
Unity için Uçak Kontrol Cihazı
Unity için Yukarıdan Aşağıya Oyuncu Kontrol Eğiticisi
Karakter Denetleyicisi Birlik İçinde Sert Cisimleri İtme Yeteneği Nasıl Eklenir
Birlik İçin Diyalog Sistemi