Создание системы рукопашного боя в Unity

Рукопашный бой в играх — это бой на близком расстоянии, когда игроки используют оружие или собственное тело для атаки врагов. Этот тип боя имеет решающее значение во многих игровых жанрах, включая приключенческие игры, ролевые игры и файтинги. Системы ближнего боя добавляют глубины игровому процессу, предоставляя игрокам интуитивный и захватывающий опыт, который отличается от боя на расстоянии. Реализация системы ближнего боя в Unity включает в себя сценарии, анимацию и обнаружение столкновений, чтобы обеспечить плавную и отзывчивую боевую механику.

В этой статье мы покажем вам, как создать базовую систему рукопашного боя в Unity, подходящую для новичков. Мы рассмотрим настройку персонажа игрока, создание анимации рукопашной атаки, написание сценариев логики атаки и реализацию обнаружения столкновений для регистрации попаданий.

Важность рукопашного боя в играх

Ближний бой необходим в определенных типах игр по нескольким причинам:

  • Захватывающий игровой процесс: Ближний бой может создать интенсивный и увлекательный игровой процесс, заставляя игроков чувствовать себя более вовлеченными в действие.
  • Разнообразие: добавление рукопашного боя в игру, в которой в основном используются дальние бои, обеспечивает разнообразие и сохраняет игровой процесс свежим и интересным.
  • Построение персонажа и мира: Бой в ближнем бою может отражать способности персонажа и сеттинг игры, улучшая общее повествование и построение мира.
  • Стратегическая глубина: игроки должны учитывать расположение, время и выбор оружия, добавляя уровни стратегии в игровой процесс.

Настройка персонажа игрока

  1. Создайте новый проект : откройте Unity и создайте новый 3D-проект.
  2. Добавить персонажа игрока: импортируйте или создайте 3D-модель вашего персонажа игрока. При необходимости вы можете использовать бесплатные ресурсы из Unity Asset Store.
  3. Настройка контроллера аниматора: создайте контроллер аниматора для управления анимацией игрока. Импортируйте необходимые анимации (холостой ход, ходьба, атака) и настройте состояния и переходы анимации.

Создание анимации рукопашной атаки

  1. Импортировать анимацию атаки:
    • Загрузите или создайте анимацию атаки для вашего персонажа.
    • Импортируйте эти анимации в Unity и добавьте их в свой контроллер Animator.
  2. Настройка анимационных переходов:
    • Создавайте переходы между состояниями ожидания, ходьбы и атаки в контроллере Animator.
    • Используйте такие параметры, как 'isAttacking', чтобы управлять этими переходами.

Сценарий логики атаки

Мы напишем сценарий C#, который будет обрабатывать логику рукопашной атаки игрока, включая запуск анимации атаки и обнаружение попаданий.

  1. Создать новый сценарий:
    • Щелкните правой кнопкой мыши в окне проекта, выберите 'Create -> C# Script' и назовите его 'PlayerCombat'.
  2. Реализация сценария:
    • Дважды щелкните сценарий, чтобы открыть его в предпочитаемом вами редакторе кода (например, 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. Назначение сценария:
    • Прикрепите скрипт 'PlayerCombat' к своему игровому персонажу.
    • Задайте 'Animator', 'Attack Point' и другие поля в Инспекторе.

Реализация вражеской логики

  1. Создайте сценарий врага:
    • Щелкните правой кнопкой мыши в окне проекта, выберите 'Create -> C# Script' и назовите его 'Enemy'.
    • Дважды щелкните сценарий, чтобы открыть его в предпочитаемом вами редакторе кода.
    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. Назначение сценария:
    • Прикрепите скрипт 'Enemy' к объектам противника.

Добавление визуальной и звуковой обратной связи

Улучшение опыта рукопашного боя с помощью визуальной и звуковой обратной связи имеет решающее значение для удовлетворения игроков. Вот как это сделать:

  1. Добавить эффекты попаданий:
    • Создавайте эффекты частиц, когда атака поражает врага.
    • Создайте экземпляр этих эффектов с помощью метода 'Attack', когда враг поражен.
  2. Добавить звуковые эффекты:
    • Импортируйте звуковые эффекты для атак и ударов.
    • Используйте компонент 'AudioSource' для воспроизведения этих звуков во время атак и при поражении врагов.
    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);
        }
    }

Заключение

Реализация системы рукопашного боя в Unity может значительно улучшить игровой процесс, особенно в жанрах, где важен ближний бой. Следуя этому руководству, вы сможете создать базовую систему ближнего боя с анимацией, логикой атаки и обнаружением столкновений. Когда вы освоитесь с Unity, вы сможете усовершенствовать систему в соответствии с вашими потребностями.