Tworzenie systemu walki wręcz w Unity

Walka wręcz w grach odnosi się do walki na bliski dystans, podczas której gracze używają broni lub własnego ciała do atakowania wrogów. Ten rodzaj walki ma kluczowe znaczenie w wielu gatunkach gier, w tym w przygodowych grach akcji, odgrywaniu ról i grach walki. Systemy walki wręcz dodają głębi rozgrywce, zapewniając graczom emocjonujące i wciągające wrażenia, różniące się od walki dystansowej. Implementacja systemu walki wręcz w Unity obejmuje skrypty, animacje i wykrywanie kolizji, aby zapewnić płynną i responsywną mechanikę walki.

W tym artykule przeprowadzimy Cię przez kolejne etapy tworzenia podstawowego systemu walki wręcz w Unity, odpowiedniego dla początkujących. Omówimy konfigurowanie postaci gracza, tworzenie animacji ataku wręcz, tworzenie skryptów logiki ataku i wdrażanie wykrywania kolizji w celu rejestrowania trafień.

Znaczenie walki wręcz w grach

Walka wręcz jest niezbędna w niektórych typach gier z kilku powodów:

  • Wciągająca rozgrywka: Walka w zwarciu może zapewnić intensywną i wciągającą rozgrywkę, dzięki czemu gracze poczują się bardziej związani z akcją.
  • Różnorodność: Dodanie walki wręcz do gry, która obejmuje głównie walkę dystansową, zapewnia różnorodność oraz sprawia, że ​​rozgrywka jest świeża i interesująca.
  • Budowanie postaci i świata: Walka w zwarciu może odzwierciedlać zdolności postaci i scenerię gry, poprawiając ogólną narrację i budowanie świata.
  • Głębia strategiczna: Gracze muszą rozważyć ustawienie, wyczucie czasu i wybór broni, dodając do rozgrywki warstwy strategii.

Konfigurowanie postaci gracza

  1. Utwórz nowy projekt: Otwórz Unity i utwórz nowy projekt 3D.
  2. Dodaj postać gracza: Importuj lub utwórz model 3D swojej postaci gracza. W razie potrzeby możesz skorzystać z bezpłatnych zasobów z Unity Asset Store.
  3. Skonfiguruj kontroler animatora: Utwórz kontroler animatora do obsługi animacji gracza. Zaimportuj niezbędne animacje (bezczynność, chodzenie, atak) i skonfiguruj stany animacji oraz przejścia.

Tworzenie animacji ataku wręcz

  1. Importuj animacje ataku:
    • Pobierz lub utwórz animacje ataku dla swojej postaci.
    • Zaimportuj te animacje do Unity i dodaj je do kontrolera Animator.
  2. Skonfiguruj przejścia animacji:
    • Twórz przejścia między stanami bezczynności, spaceru i ataku w kontrolerze Animator.
    • Aby kontrolować te przejścia, użyj parametrów takich jak 'isAttacking'.

Skryptowanie logiki ataku

Napiszemy skrypt w języku C#, który obsłuży logikę ataku wręcz gracza, włączając w to uruchamianie animacji ataku i wykrywanie trafień.

  1. Utwórz nowy skrypt:
    • Kliknij prawym przyciskiem myszy w oknie Projekt, wybierz 'Create -> C# Script' i nazwij go 'PlayerCombat'.
  2. Implementacja skryptu:
    • Kliknij dwukrotnie skrypt, aby otworzyć go w preferowanym edytorze kodu (np. 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. Przypisywanie skryptu:
    • Dołącz skrypt 'PlayerCombat' do swojej postaci gracza.
    • Ustaw 'Animator', 'Attack Point' i inne pola w Inspektorze.

Wdrażanie logiki wroga

  1. Utwórz skrypt wroga:
    • Kliknij prawym przyciskiem myszy w oknie Projekt, wybierz 'Create -> C# Script' i nazwij go 'Enemy'.
    • Kliknij dwukrotnie skrypt, aby otworzyć go w preferowanym edytorze kodu.
    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. Przypisywanie skryptu:
    • Dołącz skrypt 'Enemy' do obiektów wroga.

Dodawanie informacji zwrotnych wizualnych i dźwiękowych

Poprawa wrażeń związanych z walką wręcz za pomocą informacji wizualnych i dźwiękowych ma kluczowe znaczenie dla zadowolenia gracza. Oto jak to zrobić:

  1. Dodaj efekty trafień:
    • Twórz efekty cząsteczkowe, gdy atak trafi wroga.
    • Utwórz instancję tych efektów metodą 'Attack', gdy wróg zostanie trafiony.
  2. Dodaj efekty dźwiękowe:
    • Importuj efekty dźwiękowe ataku i uderzeń.
    • Użyj komponentu 'AudioSource', aby odtworzyć te dźwięki podczas ataków i trafień wrogów.
    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);
        }
    }

Wniosek

Implementacja systemu walki wręcz w Unity może znacznie poprawić wrażenia z rozgrywki, szczególnie w gatunkach, w których najważniejsza jest walka w zwarciu. Postępując zgodnie z tym przewodnikiem, możesz stworzyć podstawowy system walki wręcz, wraz z animacjami, logiką ataku i wykrywaniem kolizji. W miarę jak oswoisz się z Unity, będziesz mógł dalej udoskonalać system, aby dopasować go do swoich potrzeb.