Unity'de Okçuluk Mekaniğinin Uygulanması

Unity'deki okçuluk mekanikleri, oyuncuların yaydan ok atabildiği eğlenceli ve ilgi çekici bir oyun deneyimi yaratmak için kullanılabilir. Bu eğitim, yayı çekme, nişan alma ve ok atma gibi temel okçuluk mekaniklerini uygulamada size rehberlik edecektir.

1. Yay ve Ok Kurulumu

Başlamak için basit bir yay ve ok kurulumuna ihtiyacımız olacak. Kendi modelinizi oluşturabilir veya Unity Asset Store'dan varlıkları indirebilirsiniz. Bu eğitim için, yay ve ok için hazır bir 3B modeliniz olduğunu varsayacağız.

2. Yay ve Ok Komut Dosyasını Oluşturun

Yayın çizim, nişan alma ve atış işlevlerini yönetmek için BowAndArrow adında bir betik oluşturacağız.

using UnityEngine;

public class BowAndArrow : MonoBehaviour
{
    public GameObject arrowPrefab; // Reference to the arrow prefab
    public Transform bowString; // Reference to the bowstring for drawing
    public Transform spawnPoint; // Point where the arrow will be spawned
    public float drawSpeed = 2f; // Speed at which the bowstring is drawn
    public float maxDrawDistance = 3f; // Maximum draw distance for the bowstring
    public float arrowForce = 50f; // Force applied to the arrow when shot

    private float drawDistance = 0f; // Current draw distance of the bowstring

    void Update()
    {
        // Draw the bowstring when holding the fire button
        if (Input.GetButton("Fire1"))
        {
            DrawBow();
        }

        // Shoot the arrow when the fire button is released
        if (Input.GetButtonUp("Fire1") && drawDistance > 0f)
        {
            ShootArrow();
        }
    }

    void DrawBow()
    {
        // Increase the draw distance while holding the fire button
        drawDistance = Mathf.Clamp(drawDistance + drawSpeed * Time.deltaTime, 0, maxDrawDistance);
        bowString.localPosition = new Vector3(0, drawDistance, 0);
    }

    void ShootArrow()
    {
        // Instantiate and shoot the arrow
        GameObject arrow = Instantiate(arrowPrefab, spawnPoint.position, spawnPoint.rotation);
        Rigidbody arrowRb = arrow.GetComponent();
        arrowRb.AddForce(spawnPoint.forward * arrowForce * drawDistance, ForceMode.VelocityChange);

        // Reset the bowstring
        drawDistance = 0f;
        bowString.localPosition = Vector3.zero;
    }
}

Bu betik, oyuncunun ateş düğmesini basılı tutarak yay kirişini çekmesine olanak tanır ve ateş düğmesi bırakıldığında, bir ok örneklenir ve yay kirişinin ne kadar uzağa çekildiğiyle orantılı bir kuvvetle fırlatılır. Ok, yayın baktığı yönde bir hıza sahip olur.

3. Ok Prefab'ını Oluşturun

Şimdi, oyuncu ateş ettiğinde örneklenecek ok prefab'ını yaratın. Ok, fizik tabanlı hareket için bir Rigidbody bileşenine ve isteğe bağlı olarak diğer nesnelerle etkileşime girmek için bir Collider'a sahip olmalıdır.

  1. Sahnede yeni bir GameObject yaratın, ardından okun 3B modelini ekleyin (kendi modeliniz veya Unity Varlık Mağazasından bir varlık).
  2. Fizik tabanlı hareket için oka bir Katı Cisim bileşeni ekleyin.
  3. Diğer nesnelerle çarpışmayı yönetmek için bir Collider bileşeni (örneğin BoxCollider veya CapsuleCollider) ekleyin.
  4. Bu GameObject'i Proje penceresine sürükleyerek önceden hazırlanmış bir nesneye dönüştürün.

4. Yayı Nişan Almak

Yayı nişanlamak için fareyi veya sağ başparmak çubuğunu (oyun kumandaları için) kullanarak basit bir mekanik uygulayabilirsiniz. Bu örnekte, oyuncunun fareyi kullanarak nişan almak için yayı döndürmesine izin vereceğiz.

using UnityEngine;

public class BowAiming : MonoBehaviour
{
    public float rotationSpeed = 5f; // Speed at which the bow rotates

    void Update()
    {
        // Rotate the bow based on mouse movement
        float horizontal = Input.GetAxis("Mouse X");
        float vertical = Input.GetAxis("Mouse Y");

        transform.Rotate(Vector3.up * horizontal * rotationSpeed);
        transform.Rotate(Vector3.left * vertical * rotationSpeed);
    }
}

BowAiming betiği, farenin X ve Y hareketlerine göre yayı döndürür. Bu, oyuncunun yayı herhangi bir yöne nişan almasını sağlar. rotationSpeed'i ayarlayarak yayın hareketini fare girişine daha fazla veya daha az duyarlı hale getirebilirsiniz.

5. Ok Uçuşu ve Çarpışmanın Eklenmesi

Okun uçuşu, ok atıldığında kuvveti uygulayan Rigidbody bileşeni tarafından yönetilir. Oku daha gerçekçi hale getirmek için, çarpışmaları algılamak ve düşmanlara hasar verme veya yüzeylere yapışma gibi olayları tetiklemek için bir Arrow betiği ekleyebilirsiniz.

using UnityEngine;

public class Arrow : MonoBehaviour
{
    private void OnCollisionEnter(Collision collision)
    {
        // Check for collision with an enemy or other object
        if (collision.gameObject.CompareTag("Enemy"))
        {
            // Handle damage or effects here
            Debug.Log("Arrow hit the enemy!");
            Destroy(gameObject); // Destroy the arrow on impact
        }
        else
        {
            // Destroy arrow if it hits something else
            Destroy(gameObject, 2f); // Arrow disappears after 2 seconds
        }
    }
}

Arrow betiği diğer nesnelerle çarpışmaları algılar. Ok bir düşmana çarparsa, hasar veya diğer etkileri tetikleyebilirsiniz. Şimdilik, sadece bir mesaj kaydediyor ve oku yok ediyor. Bu betiği hasar vermek, özel efektler oluşturmak veya oku nesnelere yapıştırmak için genişletebilirsiniz.

6. Çizim Gücü için Kullanıcı Arayüzünün Uygulanması

Oyuncuya yayın ne kadar çekildiğine dair geri bildirim vermek için, geçerli çekme gücünü gösteren bir kullanıcı arayüzü öğesi görüntüleyebilirsiniz. Basit bir kaydırıcı, yay kirişinin çekme mesafesini temsil edebilir.

  1. Sahnede bir UI Kaydırıcısı oluşturun.
  2. Kaydırıcının değerini BowAndArrow betiğindeki drawDistance değerine bağlayın.
using UnityEngine;
using UnityEngine.UI;

public class BowAndArrow : MonoBehaviour
{
    public Slider drawStrengthSlider; // Reference to the UI slider

    void Update()
    {
        if (Input.GetButton("Fire1"))
        {
            DrawBow();
            drawStrengthSlider.value = drawDistance / maxDrawDistance; // Update the slider
        }

        if (Input.GetButtonUp("Fire1") && drawDistance > 0f)
        {
            ShootArrow();
            drawStrengthSlider.value = 0f; // Reset the slider after shooting
        }
    }
}

Bu, kaydırıcının değerini drawDistance değerine göre güncelleyerek oyuncunun yayı ne kadar çektiğini görsel olarak gösterecektir.

7. Test ve İnce Ayar

Şimdi oyunu oynayın ve yay ve ok mekaniklerini test edin. Aşağıdakileri sağlayın:

  • Yay kirişi düzgün bir şekilde geriliyor ve atıştan sonra tekrar eski haline dönüyor.
  • Ok doğru yönde hareket ediyor ve çarpışmalara tepki veriyor.
  • Nişan alma sistemi beklendiği gibi çalışıyor ve tepki veriyor.

ÇizimHızı, OkGücü ve DönmeHızı gibi değerleri istediğiniz oyun hissine uyacak şekilde ince ayar yapabilirsiniz.

Çözüm

Unity'de yay, ok mekaniği, nişan alma ve atış içeren basit ama etkili bir okçuluk sistemi uyguladık. Ayrıca çekme gücünü göstermek için bir kullanıcı arayüzü öğesi ekledik. Bu sistem, daha karmaşık bir okçuluk deneyimi için ok türleri, düşman tepkileri ve özel efektler gibi ek özellikler ile genişletilebilir.