Criando um sistema de combate corpo a corpo no Unity

O combate corpo a corpo em jogos refere-se a combates de curta distância onde os jogadores usam armas ou seus próprios corpos para atacar os inimigos. Esse tipo de combate é crucial em muitos gêneros de jogos, incluindo ação-aventura, RPG e jogos de luta. Os sistemas corpo a corpo adicionam profundidade à jogabilidade, proporcionando aos jogadores uma experiência visceral e envolvente que difere do combate à distância. A implementação de um sistema corpo a corpo em Unity envolve scripts, animação e detecção de colisão para garantir uma mecânica de combate suave e responsiva.

Neste artigo, iremos guiá-lo pelas etapas para criar um sistema básico de combate corpo a corpo em Unity, adequado para iniciantes. Abordaremos a configuração do personagem do jogador, a criação de animações de ataque corpo a corpo, o script da lógica de ataque e a implementação da detecção de colisão para registrar acertos.

Importância do combate corpo a corpo nos jogos

O combate corpo a corpo é essencial em certos tipos de jogos por vários motivos:

  • Jogabilidade envolvente: O combate corpo a corpo pode criar experiências de jogo intensas e envolventes, fazendo com que os jogadores se sintam mais conectados à ação.
  • Variedade: Adicionar combate corpo a corpo a um jogo que apresenta principalmente combate à distância proporciona variedade e mantém a jogabilidade fresca e interessante.
  • Personagem e construção de mundo: O combate corpo a corpo pode refletir as habilidades do personagem e o cenário do jogo, melhorando a narrativa geral e a construção do mundo.
  • Profundidade Estratégica: Os jogadores devem considerar posicionamento, tempo e escolha de armas, adicionando camadas de estratégia ao jogo.

Configurando o personagem do jogador

  1. Crie um novo projeto: Abra Unity e crie um novo projeto 3D.
  2. Adicionar um personagem de jogador: Importe ou crie um modelo 3D para seu personagem de jogador. Você pode usar ativos gratuitos do Unity Asset Store se necessário.
  3. Configure o Animator Controller: Crie um Animator Controller para lidar com as animações do jogador. Importe as animações necessárias (inativo, caminhada, ataque) e configure os estados e transições da animação.

Criando animações de ataque corpo a corpo

  1. Importar animações de ataque:
    • Baixe ou crie animações de ataque para seu personagem.
    • Importe essas animações para Unity e adicione-as ao seu Animator Controller.
  2. Configurar transições de animação:
    • Crie transições entre os estados inativo, de caminhada e de ataque no Animator Controller.
    • Use parâmetros como 'isAttacking' para controlar essas transições.

Script da lógica de ataque

Escreveremos um script C# que lida com a lógica de ataque corpo a corpo do jogador, incluindo o acionamento da animação de ataque e a detecção de acertos.

  1. Crie um novo script:
    • Clique com o botão direito na janela Projeto, selecione 'Create -> C# Script' e nomeie-o como 'PlayerCombat'.
  2. Implementação de script:
    • Clique duas vezes no script para abri-lo no editor de código de sua preferência (por exemplo, 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. Atribuindo o script:
    • Anexe o script 'PlayerCombat' ao seu personagem do jogador.
    • Defina 'Animator', 'Attack Point' e outros campos no Inspetor.

Implementando Lógica Inimiga

  1. Crie um script inimigo:
    • Clique com o botão direito na janela Projeto, selecione 'Create -> C# Script' e nomeie-o como 'Enemy'.
    • Clique duas vezes no script para abri-lo no editor de código de sua preferência.
    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. Atribuindo o script:
    • Anexe o script 'Enemy' aos seus objetos inimigos.

Adicionando feedback visual e sonoro

Aprimorar a experiência de combate corpo a corpo com feedback visual e sonoro é crucial para a satisfação do jogador. Veja como fazer isso:

  1. Adicionar efeitos de acerto:
    • Crie efeitos de partículas para quando um ataque atingir um inimigo.
    • Instancie esses efeitos no método 'Attack' quando um inimigo é atingido.
  2. Adicionar efeitos sonoros:
    • Importe efeitos sonoros para o ataque e impactos de acerto.
    • Use o componente 'AudioSource' para reproduzir esses sons durante ataques e quando inimigos são atingidos.
    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);
        }
    }

Conclusão

A implementação de um sistema de combate corpo a corpo em Unity pode melhorar significativamente a experiência de jogo, especialmente em gêneros onde o combate corpo a corpo é essencial. Seguindo este guia, você pode criar um sistema corpo a corpo básico, completo com animações, lógica de ataque e detecção de colisão. À medida que você se sentir mais confortável com Unity, poderá refinar ainda mais o sistema para atender às suas necessidades.