Implementering af bueskydningsmekanik i Unity

Bueskydningsmekanik i Unity kan bruges til at skabe en sjov og engagerende spiloplevelse, hvor spillere kan skyde pile fra en bue. Denne tutorial vil guide dig gennem implementering af grundlæggende bueskydningsmekanik, herunder at tegne buen, sigte og skyde pile.

1. Opsætning af bue og pil

For at begynde skal vi bruge en simpel bue og pil opsætning. Du kan enten modellere din egen eller downloade aktiver fra Unity Asset Store. Til denne tutorial antager vi, at du har en 3D-model til bue og pil klar.

2. Opret bue og pil script

Vi vil oprette et BowAndArrow script til at håndtere buens tegne-, sigte- og skydefunktioner.

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

Dette script giver spilleren mulighed for at trække buestrengen ved at holde affyringsknappen nede, og når affyringsknappen slippes, bliver en pil instantieret og skudt med en kraft, der er proportional med, hvor langt buestrengen blev trukket. Pilen får en hastighed i den retning, buen vender.

3. Opret Arrow Prefab

Opret nu pilen prefab, der vil blive instansieret, når spilleren skyder. Pilen skal have en Rigidbody-komponent til fysikbaseret bevægelse og eventuelt en Collider til at interagere med andre objekter.

  1. Opret et nyt GameObject i scenen, og tilføj derefter en 3D-model af pilen (enten din egen model eller et aktiv fra Unity Asset Store).
  2. Tilføj en Rigidbody-komponent til pilen for fysikbaseret bevægelse.
  3. Tilføj en Collider-komponent (som en BoxCollider eller CapsuleCollider) for at håndtere kollision med andre objekter.
  4. Gør dette GameObject til et præfabrikat ved at trække det ind i projektvinduet.

4. Sigte buen

For at sigte buen kan du implementere en simpel mekaniker ved hjælp af musen eller højre fingerpind (til gamepads). I dette eksempel tillader vi spilleren at dreje buen for at sigte ved hjælp af musen.

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-scriptet roterer buen baseret på musens X- og Y-bevægelser. Dette giver spilleren mulighed for at rette buen i enhver retning. Du kan justere rotationSpeed for at gøre buens bevægelse mere eller mindre følsom over for musens input.

5. Tilføjelse af Arrow Flight and Collision

Pilens flugt håndteres af Rigidbody-komponenten, som påfører kraften, når pilen skydes. For at gøre pilen mere realistisk kan du tilføje et Arrow-script til at registrere kollisioner og udløse hændelser, såsom at beskadige fjender eller holde sig til overflader.

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-scriptet registrerer kollisioner med andre objekter. Hvis pilen rammer en fjende, kan du udløse skader eller andre effekter. For nu logger den blot en besked og ødelægger pilen. Du kan udvide dette script for at gøre skade, skabe specielle effekter eller få pilen til at klæbe til objekter.

6. Implementering af UI for Draw Strength

For at give spilleren feedback på, hvor meget buen er trukket, kan du vise et UI-element, der viser den aktuelle trækstyrke. En simpel skyder kan repræsentere buestrengens trækafstand.

  1. Opret en UI-skyder i scenen.
  2. Link skyderens værdi til drawDistance i BowAndArrow scriptet.
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
        }
    }
}

Dette vil visuelt vise, hvor meget spilleren har trukket buen ved at opdatere skyderens værdi baseret på drawDistance.

7. Test og finjustering

Spil nu spillet og test bue- og pilmekanikken. Sørg for følgende:

  • Buestrengen trækker jævnt og nulstilles efter skydning.
  • Pilen bevæger sig i den rigtige retning og reagerer på kollisioner.
  • Sigtesystemet fungerer som forventet og er responsivt.

Du kan finjustere værdier som drawSpeed, arrowForce og rotationSpeed for at matche din ønskede gameplay-fornemmelse.

Konklusion

Vi implementerede et simpelt, men effektivt bueskydningssystem i Unity, med bue, pilmekanik, sigte og skydning. Vi inkluderede også et UI-element for at vise trækstyrken. Dette system kan udvides med yderligere funktioner som piletyper, fjendens reaktioner og specialeffekter for en mere kompleks bueskydningsoplevelse.