Oprettelse af et nærkampssystem i Unity

Nærkampe i spil refererer til kampe på nært hold, hvor spillere bruger våben eller deres egen krop til at angribe fjender. Denne type kamp er afgørende i mange spilgenrer, herunder action-eventyr, rollespil og kampspil. Nærkampssystemer tilføjer dybde til gameplayet og giver spillerne en visceral og fordybende oplevelse, der adskiller sig fra kamp på afstand. Implementering af et nærkampssystem i Unity involverer scripting, animation og kollisionsdetektion for at sikre jævn og responsiv kampmekanik.

I denne artikel vil vi guide dig gennem trinene til at skabe et grundlæggende nærkampssystem i Unity, velegnet til begyndere. Vi vil dække opsætning af spillerkarakteren, oprettelse af nærkampangrebsanimationer, scripting af angrebslogikken og implementering af kollisionsdetektion for at registrere hits.

Betydningen af ​​nærkamp i spil

Nærkamp er afgørende i visse typer spil af flere årsager:

  • Immersive Gameplay: Kampe på nært hold kan skabe intense og engagerende spiloplevelser, hvilket får spillerne til at føle sig mere forbundet med handlingen.
  • Variety: Tilføjelse af nærkampe til et spil, der primært byder på ranged kamp, ​​giver variation og holder gameplayet frisk og interessant.
  • Karakter- og verdensbygning: Nærkamp kan afspejle karakterens evner og spillets rammer, hvilket forbedrer den overordnede fortælling og verdensopbygning.
  • Strategisk dybde: Spillere skal overveje positionering, timing og våbenvalg og tilføje lag af strategi til gameplayet.

Opsætning af spillerkarakteren

  1. Opret et nyt projekt: Åbn Unity og opret et nyt 3D-projekt.
  2. Tilføj en spillerkarakter: Importer eller opret en 3D-model til din spillerkarakter. Du kan bruge gratis aktiver fra Unity Asset Store, hvis det er nødvendigt.
  3. Konfigurer Animator Controller: Opret en Animator Controller til at håndtere spillerens animationer. Importer de nødvendige animationer (tomgang, gang, angreb) og opsæt animationstilstande og overgange.

Oprettelse af nærkampsanimationer

  1. Importer angrebsanimationer:
    • Download eller opret angrebsanimationer til din karakter.
    • Importer disse animationer til Unity og føj dem til din Animator Controller.
  2. Konfigurer animationsovergange:
    • Opret overgange mellem tomgang, gang og angreb i Animator Controller.
    • Brug parametre såsom 'isAttacking' til at styre disse overgange.

Skriver angrebslogikken

Vi vil skrive et C#-script, der håndterer spillerens nærkampangrebslogik, herunder udløsning af angrebsanimationen og detektering af hits.

  1. Opret et nyt script:
    • Højreklik i projektvinduet, vælg 'Create -> C# Script', og navngiv det 'PlayerCombat'.
  2. Script implementering:
    • Dobbeltklik på scriptet for at åbne det i din foretrukne kodeeditor (f.eks. Visual Studio Code).
    using UnityEngine;
    
    public class PlayerCombat : MonoBehaviour
    {
        public Animator animator;
        public Transform attackPoint;
        public float attackRange = 0.5f;
        public LayerMask enemyLayers;
        public int attackDamage = 40;
        public float attackRate = 2f;
        private float nextAttackTime = 0f;
    
        void Update()
        {
            if (Time.time >= nextAttackTime)
            {
                if (Input.GetButtonDown("Fire1"))
                {
                    Attack();
                    nextAttackTime = Time.time + 1f / attackRate;
                }
            }
        }
    
        void Attack()
        {
            animator.SetTrigger("Attack");
    
            // Detect enemies in range of the attack
            Collider[] hitEnemies = Physics.OverlapSphere(attackPoint.position, attackRange, enemyLayers);
    
            // Damage them
            foreach (Collider enemy in hitEnemies)
            {
                enemy.GetComponent().TakeDamage(attackDamage);
            }
        }
    
        void OnDrawGizmosSelected()
        {
            if (attackPoint == null)
                return;
    
            Gizmos.DrawWireSphere(attackPoint.position, attackRange);
        }
    }
  3. Tildeling af scriptet:
    • Vedhæft 'PlayerCombat' scriptet til din spillerfigur.
    • Indstil 'Animator', 'Attack Point' og andre felter i Inspector.

Implementering af fjendelogik

  1. Opret et fjende-script:
    • Højreklik i projektvinduet, vælg 'Create -> C# Script', og navngiv det 'Enemy'.
    • Dobbeltklik på scriptet for at åbne det i din foretrukne kodeeditor.
    using UnityEngine;
    
    public class Enemy : MonoBehaviour
    {
        public int maxHealth = 100;
        int currentHealth;
    
        void Start()
        {
            currentHealth = maxHealth;
        }
    
        public void TakeDamage(int damage)
        {
            currentHealth -= damage;
    
            if (currentHealth <= 0)
            {
                Die();
            }
        }
    
        void Die()
        {
            // Add death animation or effects
            Destroy(gameObject);
        }
    }
  2. Tildeling af scriptet:
    • Vedhæft 'Enemy' scriptet til dine fjendeobjekter.

Tilføjelse af visuel og lydfeedback

Forbedring af nærkampsoplevelsen med visuel og lydfeedback er afgørende for spillernes tilfredshed. Sådan gør du:

  1. Tilføj hiteffekter:
    • Skab partikeleffekter, når et angreb rammer en fjende.
    • Instantiér disse effekter i 'Attack'-metoden, når en fjende bliver ramt.
  2. Tilføj lydeffekter:
    • Importer lydeffekter til angrebet og slagpåvirkningerne.
    • Brug 'AudioSource'-komponenten til at afspille disse lyde under angreb, og når fjender bliver ramt.
    using UnityEngine;
    
    public class PlayerCombat : MonoBehaviour
    {
        public Animator animator;
        public Transform attackPoint;
        public float attackRange = 0.5f;
        public LayerMask enemyLayers;
        public int attackDamage = 40;
        public float attackRate = 2f;
        private float nextAttackTime = 0f;
        public AudioClip attackSound;
        public AudioClip hitSound;
        private AudioSource audioSource;
        public GameObject hitEffect;
    
        void Start()
        {
            audioSource = GetComponent();
        }
    
        void Update()
        {
            if (Time.time >= nextAttackTime)
            {
                if (Input.GetButtonDown("Fire1"))
                {
                    Attack();
                    nextAttackTime = Time.time + 1f / attackRate;
                }
            }
        }
    
        void Attack()
        {
            animator.SetTrigger("Attack");
            audioSource.PlayOneShot(attackSound);
    
            // Detect enemies in range of the attack
            Collider[] hitEnemies = Physics.OverlapSphere(attackPoint.position, attackRange, enemyLayers);
    
            // Damage them and play hit effect
            foreach (Collider enemy in hitEnemies)
            {
                enemy.GetComponent().TakeDamage(attackDamage);
                audioSource.PlayOneShot(hitSound);
                Instantiate(hitEffect, enemy.transform.position, Quaternion.identity);
            }
        }
    
        void OnDrawGizmosSelected()
        {
            if (attackPoint == null)
                return;
    
            Gizmos.DrawWireSphere(attackPoint.position, attackRange);
        }
    }

Konklusion

Implementering af et nærkampssystem i Unity kan forbedre gameplay-oplevelsen markant, især i genrer, hvor tætte kampe er afgørende. Ved at følge denne guide kan du oprette et grundlæggende nærkampssystem, komplet med animationer, angrebslogik og kollisionsdetektion. Efterhånden som du bliver mere komfortabel med Unity, kan du forfine systemet yderligere, så det passer til dine behov.