Создание игры в стиле Clash of Clans в Unity. Часть 2

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

Настройка префабов войск

Во-первых, нам необходимо создать заготовки войск, которые будут представлять различные юниты в игре.

  1. Создайте новый игровой объект для своего отряда, щелкнув правой кнопкой мыши в Иерархии и выбрав 2D-объект > Спрайт.
  2. Назовите его Воин и назначьте спрайт из ваших ресурсов.
  3. Прикрепите новый скрипт с именем Troop для обработки логики отрядов.
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);
    }
}

Создание менеджера отряда

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

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

Реализация механики атаки

Для атаки мы создадим базовую систему, в которой войска смогут атаковать здания или другие юниты.

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

Развертывание войск из пользовательского интерфейса

Далее мы настроим простую кнопку пользовательского интерфейса для развертывания войск. В Canvas создадим кнопку и назначим функцию развертывания.

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

Добавление защиты противника

Чтобы сделать игру более интерактивной, давайте реализуем оборону противника, которая будет атаковать войска.

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

Заключение

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

Следующие шаги