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.
- Buat GameObject baru dalam adegan, lalu tambahkan model 3D panah (bisa model Anda sendiri atau aset dari Unity Asset Store).
- Tambahkan komponen Rigidbody ke panah untuk gerakan berbasis fisika.
- Tambahkan komponen Collider (seperti BoxCollider atau CapsuleCollider) untuk menangani tabrakan dengan objek lain.
- 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.
- Buat UI Slider dalam adegan.
- Hubungkan nilai slider ke
drawDistance
dalam skripBowAndArrow
.
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.