Unity'de Gelişmiş Oyuncu Hareketi

Bu eğitimde, Unity'deki ileri düzey oyuncu hareket mekaniklerini, koşma, çömelme ve akıcı bir kamera sistemini keşfedeceğiz. Bu özellikler, oyuncu kontrollerine derinlik ve cila katarak genel oyun deneyimini geliştirir. Gerçekçi hareket ve etkileşimler için Unity'nin fizik sistemini kullanacağız.

Sahneyi Kurmak

Kodlamaya başlamadan önce, bir oyuncu nesnesi ve bir kamera ile basit bir sahne kuralım:

  1. Yeni bir Unity projesi oluşturun.
  2. Hiyerarşi'de bir 3D Küp oluşturun, adını Oyuncu olarak değiştirin ve bir karaktere benzeyecek şekilde ölçeklendirin (örneğin, X: 1, Y: 2, Z: 1).
  3. Oynatıcıya Rigidbody bileşenini ekleyin ve akıcı fizik için Interpolate özelliğini Interpolate olarak ayarlayın.
  4. Kapsül Çarpıştırıcısı bileşenini ekleyin, yüksekliğini ve yarıçapını oynatıcı modeline uyacak şekilde ayarlayın.
  5. Boş bir GameObject yaratın, adını CameraRig koyun ve ona bir Camera ekleyin. Kamerayı oyuncunun arkasına ve biraz üstüne yerleştirin.
  6. CameraRig nesnesini, hareketlerini takip edecek bir Player nesnesinin çocuğu yapın.

Gelişmiş Oyuncu Hareketini Uygulama

Temel hareketleri, koşmayı, çömelmeyi ve yumuşak kamera dönüşünü ele alan bir senaryo uygulayacağız.

PlayerMovement Komut Dosyası

using UnityEngine;

public class PlayerMovement : MonoBehaviour
{
    public float walkSpeed = 5f;
    public float sprintSpeed = 10f;
    public float crouchSpeed = 2.5f;
    public float jumpForce = 5f;
    public float gravity = 20f;

    public Transform cameraTransform;
    public float lookSensitivity = 2f;
    public float maxLookAngle = 80f;

    private Rigidbody rb;
    private float currentSpeed;
    private bool isCrouching = false;
    private bool isGrounded = false;

    private void Start()
    {
        rb = GetComponent();
        rb.freezeRotation = true; // Prevent the Rigidbody from rotating
    }

    private void Update()
    {
        HandleMovement();
        HandleJumping();
        HandleCrouching();
        HandleCameraRotation();
    }

    private void HandleMovement()
    {
        float moveHorizontal = Input.GetAxis("Horizontal");
        float moveVertical = Input.GetAxis("Vertical");

        Vector3 move = transform.right * moveHorizontal + transform.forward * moveVertical;
        move = move.normalized * currentSpeed * Time.deltaTime;

        Vector3 velocity = rb.velocity;
        velocity.x = move.x;
        velocity.z = move.z;
        rb.velocity = velocity;
    }

    private void HandleJumping()
    {
        if (Input.GetButtonDown("Jump") && isGrounded)
        {
            rb.velocity = new Vector3(rb.velocity.x, jumpForce, rb.velocity.z);
        }
    }

    private void HandleCrouching()
    {
        if (Input.GetKeyDown(KeyCode.LeftControl))
        {
            isCrouching = !isCrouching;
            currentSpeed = isCrouching ? crouchSpeed : walkSpeed;
            transform.localScale = new Vector3(1, isCrouching ? 0.5f : 1, 1);
        }

        if (Input.GetKey(KeyCode.LeftShift) && !isCrouching)
        {
            currentSpeed = sprintSpeed;
        }
        else if (!isCrouching)
        {
            currentSpeed = walkSpeed;
        }
    }

    private void HandleCameraRotation()
    {
        float mouseX = Input.GetAxis("Mouse X") * lookSensitivity;
        float mouseY = Input.GetAxis("Mouse Y") * lookSensitivity;

        Vector3 rotation = cameraTransform.localEulerAngles;
        rotation.y += mouseX;
        rotation.x -= mouseY;
        rotation.x = Mathf.Clamp(rotation.x, -maxLookAngle, maxLookAngle);

        cameraTransform.localEulerAngles = rotation;
    }

    private void OnCollisionStay(Collision collision)
    {
        if (collision.gameObject.CompareTag("Ground"))
        {
            isGrounded = true;
        }
    }

    private void OnCollisionExit(Collision collision)
    {
        if (collision.gameObject.CompareTag("Ground"))
        {
            isGrounded = false;
        }
    }
}

Temel Özellikler ve Açıklama

Hareket ve Hız Kontrolü

Betik, oyuncuyu hareket ettirmek için Unity'nin Rigidbody'ini kullanır ve bu da fizik tabanlı etkileşimlere olanak tanır. Hız, oyuncunun yürümesine, koşmasına veya çömelmesine göre değişir. Çömelme, LeftControl tuşuyla açılıp kapatılır ve LeftShift tuşu basılı tutulurken sprint gerçekleşir.

Atlama

HandleJumping yöntemi, oyuncunun yere basması koşuluyla, oyuncu zıplama düğmesine (varsayılan: boşluk çubuğu) bastığında yukarı doğru bir kuvvet uygular. Zemin tespiti, "Ground" etiketli nesnelerle çarpışma olup olmadığını kontrol ederek gerçekleştirilir.

Kamera Kontrolü

Kameranın dönüşü fare kullanılarak kontrol edilir ve kameranın konumuna göre birinci şahıs veya üçüncü şahıs perspektifi sağlanır. Bakış açısı, oyuncuları şaşırtabilecek aşırı eğilmeyi önlemek için sabitlenir.

Çözüm

Bu eğitim, fizik tabanlı kontrol, koşma, çömelme ve kamera yönetimi gibi çeşitli yönleri kapsayan Unity'de gelişmiş oyuncu hareketi için bir temel sağlar. Bu teknikler, farklı oyun türlerine ve stillerine uyacak şekilde daha da özelleştirilebilir ve genişletilebilir, duyarlı ve gerçekçi kontrollerle oyuncu deneyimini geliştirir.

Unutmayın, oyuncu hareketi oyunun kritik bir yönüdür ve tatmin edici bir oyuncu deneyimi sağlamak için dikkatlice ayarlanmalıdır. Projeniz için en iyi kurulumu bulmak için farklı değerler ve özellikler deneyin.