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

In questa seconda parte della nostra serie di tutorial, implementeremo le meccaniche delle truppe per attaccare e difendere nel nostro gioco simile a Clash of Clans. Creeremo unità di truppe, gestiremo i loro movimenti e comportamenti e consentiremo ai giocatori di schierarle durante gli attacchi.

Impostazione dei prefabbricati delle truppe

Per prima cosa dobbiamo creare prefabbricati delle truppe che rappresentino le diverse unità del gioco.

  1. Crea un nuovo GameObject per la tua truppa facendo clic con il pulsante destro del mouse sulla Gerarchia e selezionando Oggetto 2D > Sprite.
  2. Chiamalo Warrior e assegnagli uno sprite dalle tue risorse.
  3. Allega un nuovo script denominato Troop per gestire la logica delle truppe.
using UnityEngine;

public class Troop : MonoBehaviour
{
    public float movementSpeed = 2f;
    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()
    {
        // Logic for attacking the target
        Debug.Log("Attacking " + target.name);
    }
}

Creazione di un responsabile delle truppe

Creeremo un responsabile delle truppe che si occuperà dello spiegamento delle truppe e della gestione delle truppe attive sul campo di battaglia.

using System.Collections.Generic;
using UnityEngine;

public class TroopManager : MonoBehaviour
{
    public GameObject troopPrefab;
    private List activeTroops = new List();

    public void DeployTroop(Vector3 position)
    {
        GameObject troopObject = Instantiate(troopPrefab, position, Quaternion.identity);
        Troop troop = troopObject.GetComponent();
        activeTroops.Add(troop);
    }

    void Update()
    {
        // Here we can handle troop behaviors or remove them if needed
        for (int i = activeTroops.Count - 1; i >= 0; i--)
        {
            if (activeTroops[i] == null)
            {
                activeTroops.RemoveAt(i);
            }
        }
    }
}

Implementazione della meccanica di attacco

Per attaccare, creeremo un sistema di base in cui le truppe potranno attaccare edifici o altre unità.

using UnityEngine;

public class Building : MonoBehaviour
{
    public int health = 50;

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

Distribuire le truppe dall'interfaccia utente

Successivamente, imposteremo un semplice pulsante UI per schierare le truppe. Nella Canvas, crea un pulsante e assegna la funzione di schieramento.

using UnityEngine;
using UnityEngine.UI;

public class UIManager : MonoBehaviour
{
    public TroopManager troopManager;
    public Button deployButton;

    void Start()
    {
        deployButton.onClick.AddListener(OnDeployButtonClicked);
    }

    private void OnDeployButtonClicked()
    {
        Vector3 deployPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        deployPosition.z = 0; // Set z to 0 for 2D
        troopManager.DeployTroop(deployPosition);
    }
}

Aggiungere la difesa nemica

Per rendere il gioco più interattivo, implementiamo le difese nemiche che attaccheranno le truppe.

public class EnemyDefense : MonoBehaviour
{
    public float attackRange = 2f;
    public int damage = 5;
    private Troop target;

    void Update()
    {
        if (target != null)
        {
            if (Vector2.Distance(transform.position, target.transform.position) < attackRange)
            {
                Attack();
            }
        }
    }

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

    private void Attack()
    {
        // Logic to damage the target troop
        Debug.Log("Attacking troop " + target.name);
        target.TakeDamage(damage);
    }
}

Conclusione

In questo tutorial, abbiamo implementato le meccaniche di base delle truppe per attaccare e difendere nel nostro gioco simile a Clash of Clans. Abbiamo trattato lo schieramento delle truppe, il movimento, il comportamento di attacco e le difese nemiche. Puoi espandere ulteriormente queste meccaniche aggiungendo tipi di truppe, abilità speciali e un'IA nemica più complessa.

Prossimi passi