Creare un gioco simile a Clash of Clans in Unity Pt. 3

In questa terza parte della nostra serie di tutorial, implementeremo un sistema di combattimento per consentire ai giocatori di interagire con altri giocatori o con l'IA. Ciò include la gestione delle interazioni delle truppe, della salute, delle animazioni di combattimento e delle meccaniche di battaglia generali.

Migliorare la classe delle truppe

Dobbiamo potenziare la classe Troop esistente per gestire meglio il combattimento. Ciò includerà il monitoraggio della salute e la gestione degli attacchi sia dei giocatori che dell'IA.

using UnityEngine;

public class Troop : MonoBehaviour
{
    public float movementSpeed = 2f;
    public int health = 50; // Added health property
    public int damage = 10;
    public float attackRange = 1f;
    private GameObject target;

    void Update()
    {
        if (target != null)
        {
            MoveTowardsTarget();
        }
    }

    public void SetTarget(GameObject newTarget)
    {
        target = newTarget;
    }

    private void MoveTowardsTarget()
    {
        float step = movementSpeed * Time.deltaTime;
        transform.position = Vector2.MoveTowards(transform.position, target.transform.position, step);

        if (Vector2.Distance(transform.position, target.transform.position) < attackRange)
        {
            Attack();
        }
    }

    private void Attack()
    {
        // Attack the target
        Building building = target.GetComponent();
        if (building != null)
        {
            building.TakeDamage(damage);
            Debug.Log(name + " attacked " + target.name);
        }
    }

    public void TakeDamage(int damage)
    {
        health -= damage;
        Debug.Log(name + " takes " + damage + " damage.");
        
        if (health <= 0)
        {
            Destroy(gameObject);
            Debug.Log(name + " destroyed!");
        }
    }
}

Creazione di un gestore di combattimento

Creeremo un CombatManager che gestirà le interazioni tra le truppe, tra cui il rilevamento della loro posizione a tiro per attaccare e la gestione dei loro obiettivi.

using UnityEngine;
using System.Collections.Generic;

public class CombatManager : MonoBehaviour
{
    public List playerTroops;
    public List enemyTroops;

    void Update()
    {
        foreach (Troop troop in playerTroops)
        {
            FindTarget(troop, enemyTroops);
        }

        foreach (Troop troop in enemyTroops)
        {
            FindTarget(troop, playerTroops);
        }
    }

    private void FindTarget(Troop troop, List enemyTroops)
    {
        foreach (Troop enemy in enemyTroops)
        {
            if (Vector2.Distance(troop.transform.position, enemy.transform.position) < troop.attackRange)
            {
                troop.SetTarget(enemy.gameObject);
                return; // Exit after setting the first target
            }
        }

        troop.SetTarget(null); // No target found
    }
}

Implementazione del comportamento dell'IA

Per rendere il combattimento più coinvolgente, possiamo implementare un comportamento di base dell'IA per le truppe nemiche.

public class EnemyAI : MonoBehaviour
{
    public float patrolRange = 5f;
    private Vector2 startPosition;

    void Start()
    {
        startPosition = transform.position;
    }

    void Update()
    {
        // Simple patrol logic
        transform.Translate(Vector2.right * Mathf.Sin(Time.time) * Time.deltaTime);

        // Check if the troop is in range to attack
        Troop troop = GetComponent();
        if (troop != null && troop.target == null)
        {
            // Find a new target
            CombatManager combatManager = FindObjectOfType();
            combatManager.FindTarget(troop, combatManager.playerTroops);
        }
    }
}

Creazione di animazioni di battaglia

Per migliorare l'attrattiva visiva del combattimento, possiamo aggiungere semplici animazioni alle nostre truppe. Puoi usare il componente Animator di Unity per impostare animazioni di attacco di base.

  1. Importa le animazioni delle tue truppe in Unity.
  2. Nella classe Troop, crea una variabile pubblica Animator.
  3. Attiva l'animazione durante il metodo Attacco.
public class Troop : MonoBehaviour
{
    public Animator animator; // Add this line

    private void Attack()
    {
        animator.SetTrigger("Attack"); // Trigger attack animation
        // ... rest of the attack logic
    }
}

Creazione di un'interfaccia utente di combattimento

Implementeremo un'interfaccia utente semplice per visualizzare le barre della salute delle truppe e altre informazioni rilevanti sul combattimento.

  1. Nella Gerarchia, crea una nuova UI > Canvas.
  2. Aggiungi gli elementi UI > Immagine per rappresentare le barre della salute per ogni truppa.
  3. Utilizza uno script per aggiornare le barre della salute in base alla salute della truppa.
using UnityEngine;
using UnityEngine.UI;

public class HealthBar : MonoBehaviour
{
    public Troop troop;
    public Image healthBar;

    void Update()
    {
        float healthPercentage = (float)troop.health / 50; // Assuming max health is 50
        healthBar.fillAmount = healthPercentage;
    }
}

Conclusione

In questo tutorial, abbiamo aggiunto un sistema di combattimento che consente ai giocatori di interagire con altri giocatori o con l'IA. Abbiamo implementato interazioni tra truppe, gestione della salute, animazioni di combattimento e UI per lo stato di salute. Ciò costituisce la base per un'esperienza di gioco più interattiva e strategica nel tuo gioco simile a Clash of Clans.

Prossimi passi