Menerapkan Mekanika Panahan di Unity

Mekanika memanah di Unity dapat digunakan untuk menciptakan pengalaman bermain yang seru dan menarik, di mana pemain dapat menembakkan anak panah dari busur. Tutorial ini akan memandu Anda menerapkan mekanika memanah dasar, termasuk menarik busur, membidik, dan menembakkan anak panah.

1. Menyiapkan Busur dan Anak Panah

Untuk memulai, kita perlu menyiapkan busur dan anak panah sederhana. Anda dapat membuat model sendiri atau mengunduh aset dari Unity Asset Store. Untuk tutorial ini, kami berasumsi Anda telah menyiapkan model 3D untuk busur dan anak panah.

2. Buat Skrip Busur dan Anak Panah

Kita akan membuat skrip BowAndArrow untuk menangani fungsi menggambar, membidik, dan menembak busur.

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;
    }
}

Skrip ini memungkinkan pemain untuk menarik tali busur dengan menahan tombol tembak, dan saat tombol tembak dilepaskan, anak panah terbentuk dan ditembakkan dengan gaya yang sebanding dengan seberapa jauh tali busur ditarik. Anak panah diberi kecepatan ke arah busur menghadap.

3. Buat Prefab Panah

Sekarang, buat prefab anak panah yang akan dibuat saat pemain menembak. Anak panah harus memiliki komponen Rigidbody untuk gerakan berbasis fisika, dan secara opsional Collider untuk berinteraksi dengan objek lain.

  1. Buat GameObject baru dalam adegan, lalu tambahkan model 3D panah (bisa model Anda sendiri atau aset dari Unity Asset Store).
  2. Tambahkan komponen Rigidbody ke panah untuk gerakan berbasis fisika.
  3. Tambahkan komponen Collider (seperti BoxCollider atau CapsuleCollider) untuk menangani tabrakan dengan objek lain.
  4. Jadikan GameObject ini prefab dengan menyeretnya ke jendela Proyek.

4. Membidik Busur

Untuk membidik busur, Anda dapat menerapkan mekanisme sederhana menggunakan mouse atau stik jempol kanan (untuk gamepad). Dalam contoh ini, kami akan mengizinkan pemain untuk memutar busur untuk membidik menggunakan mouse.

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);
    }
}

Skrip BowAiming memutar busur berdasarkan gerakan mouse X dan Y. Hal ini memungkinkan pemain untuk mengarahkan busur ke arah mana pun. Anda dapat menyesuaikan rotationSpeed untuk membuat gerakan busur lebih atau kurang sensitif terhadap masukan mouse.

5. Menambahkan Panah Terbang dan Tabrakan

Penerbangan anak panah ditangani oleh komponen Rigidbody, yang menerapkan gaya saat anak panah ditembakkan. Untuk membuat anak panah lebih realistis, Anda dapat menambahkan skrip Arrow untuk mendeteksi tabrakan dan memicu kejadian, seperti merusak musuh atau menempel di permukaan.

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
        }
    }
}

Skrip Arrow mendeteksi tabrakan dengan objek lain. Jika anak panah mengenai musuh, Anda dapat memicu kerusakan atau efek lainnya. Untuk saat ini, skrip ini hanya mencatat pesan dan menghancurkan anak panah. Anda dapat memperluas skrip ini untuk menimbulkan kerusakan, membuat efek khusus, atau membuat anak panah menempel pada objek.

6. Menerapkan UI untuk Kekuatan Gambar

Untuk memberikan umpan balik kepada pemain tentang seberapa jauh busur ditarik, Anda dapat menampilkan elemen UI yang menunjukkan kekuatan tarikan saat ini. Slider sederhana dapat menunjukkan jarak tarikan tali busur.

  1. Buat UI Slider dalam adegan.
  2. Hubungkan nilai slider ke drawDistance dalam skrip BowAndArrow.
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
        }
    }
}

Ini akan menampilkan secara visual seberapa banyak pemain telah menarik busur dengan memperbarui nilai slider berdasarkan drawDistance.

7. Pengujian dan Penyetelan Halus

Sekarang, mainkan gamenya dan uji mekanisme busur dan anak panah. Pastikan hal berikut:

  • Tali busur ditarik dengan lancar dan disetel ulang setelah ditembakkan.
  • Anak panah itu bergerak ke arah yang benar dan bereaksi terhadap tabrakan.
  • Sistem bidikan bekerja seperti yang diharapkan dan responsif.

Anda dapat menyempurnakan nilai seperti drawSpeed, arrowForce, dan rotationSpeed agar sesuai dengan nuansa permainan yang Anda inginkan.

Kesimpulan

Kami menerapkan sistem memanah yang sederhana namun efektif di Unity, yang menampilkan busur, mekanisme anak panah, bidikan, dan tembakan. Kami juga menyertakan elemen UI untuk menunjukkan kekuatan tarikan. Sistem ini dapat diperluas dengan fitur tambahan seperti jenis anak panah, reaksi musuh, dan efek khusus untuk pengalaman memanah yang lebih kompleks.