Tworzenie gry podobnej do Clash of Clans w Unity Pt. 2

W tej drugiej części naszego serii samouczków wdrożymy mechanikę oddziałów do atakowania i obrony w naszej grze podobnej do Clash of Clans. Stworzymy jednostki oddziałów, będziemy zarządzać ich ruchem i zachowaniem oraz pozwolimy graczom na rozmieszczanie ich podczas ataków.

Przygotowanie prefabrykatów oddziałów

Najpierw musimy stworzyć prefabrykaty wojsk, które będą reprezentować różne jednostki w grze.

  1. Utwórz nowy obiekt gry dla swojego oddziału, klikając prawym przyciskiem myszy w Hierarchii i wybierając Obiekt 2D > Sprite.
  2. Nadaj mu nazwę Wojownik i przypisz duszka ze swoich zasobów.
  3. Dołącz nowy skrypt o nazwie Troop, aby obsługiwać logikę wojsk.
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);
    }
}

Tworzenie menedżera oddziałów

Stworzymy Menedżera Wojsk, który będzie zajmował się rozmieszczeniem wojsk i zarządzał wojskami aktywnymi na polu bitwy.

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);
            }
        }
    }
}

Wdrażanie mechanizmu ataku

Na potrzeby ataku utworzymy podstawowy system, w którym wojska będą mogły atakować budynki lub inne jednostki.

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!");
        }
    }
}

Rozmieszczanie wojsk z poziomu interfejsu użytkownika

Następnie skonfigurujemy prosty przycisk UI do rozmieszczania wojsk. W Canvas utwórz przycisk i przypisz funkcję rozmieszczania.

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);
    }
}

Dodawanie obrony wroga

Aby gra była bardziej interaktywna, wprowadźmy obronę wroga, która będzie atakować nasze oddziały.

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);
    }
}

Wniosek

W tym samouczku zaimplementowaliśmy podstawowe mechanizmy oddziałów do ataku i obrony w naszej grze podobnej do Clash of Clans. Omówiliśmy rozmieszczenie oddziałów, ruch, zachowanie podczas ataku i obronę wroga. Możesz rozszerzyć te mechanizmy, dodając typy oddziałów, specjalne umiejętności i bardziej złożoną sztuczną inteligencję wroga.

Następne kroki