Створення гри, схожої на Clash of Clans, в Unity Pt. 4

У цій четвертій частині нашої серії навчальних посібників ми запровадимо спеціальні здібності для різних типів військ у нашій грі, схожій на Clash of Clans. Спеціальні здібності додають геймплею глибини та стратегії, роблячи кожне військо унікальним та привабливішим.

Визначення видів військ

Спочатку давайте визначимо різні типи військ з їхніми відповідними здібностями. Ми створимо базовий клас під назвою Troop і виведемо з нього конкретні типи військ.

using UnityEngine;

public abstract class Troop : MonoBehaviour
{
    public float movementSpeed = 2f;
    public int health = 50;
    public int damage = 10;
    public float attackRange = 1f;

    public abstract void SpecialAbility(); // Abstract method for special ability

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

    // Other existing methods...
}

Створення конкретних видів військ

Тепер давайте створимо спеціальні класи військ, які успадковують клас Troop, і реалізуємо їхні унікальні спеціальні здібності.

// Warrior Troop
public class Warrior : Troop
{
    public override void SpecialAbility()
    {
        // Example: Increase damage temporarily
        damage *= 2;
        Debug.Log(name + " activates special ability: Double Damage!");
    }
}

// Archer Troop
public class Archer : Troop
{
    public override void SpecialAbility()
    {
        // Example: Long-range attack
        attackRange *= 2;
        Debug.Log(name + " activates special ability: Long Range!");
    }
}

Запуск спеціальних здібностей

Нам потрібен спосіб активації спеціальних здібностей під час бою. Ми можемо додати метод у CombatManager, щоб дозволити військам використовувати свої здібності.

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

    void Update()
    {
        foreach (Troop troop in playerTroops)
        {
            FindTarget(troop, enemyTroops);
            if (Input.GetKeyDown(KeyCode.Space)) // Press Space to use special ability
            {
                troop.SpecialAbility();
            }
        }

        foreach (Troop troop in enemyTroops)
        {
            FindTarget(troop, playerTroops);
            // Optional: Add AI logic to use special abilities
        }
    }

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

Додавання часу відновлення до спеціальних здібностей

Щоб запобігти спаму спеціальних здібностей, ми можемо додати механізм відновлення до кожного типу військ.

public abstract class Troop : MonoBehaviour
{
    // Existing properties...
    public float specialAbilityCooldown = 5f;
    private float lastAbilityTime;

    public virtual void SpecialAbility()
    {
        if (Time.time >= lastAbilityTime + specialAbilityCooldown)
        {
            lastAbilityTime = Time.time;
            // Override in derived classes
        }
        else
        {
            Debug.Log(name + " ability on cooldown.");
        }
    }

    // Other existing methods...
}

Створення інтерфейсу користувача для спеціальних здібностей

Корисно мати елемент інтерфейсу користувача, який показує, коли військо може використовувати свою спеціальну здатність. Ви можете створити просту кнопку інтерфейсу користувача для кожного війська, яка активує їхню здатність.

using UnityEngine;
using UnityEngine.UI;

public class UIManager : MonoBehaviour
{
    public Troop troop;
    public Button specialAbilityButton;

    void Start()
    {
        specialAbilityButton.onClick.AddListener(OnSpecialAbilityClicked);
    }

    private void OnSpecialAbilityClicked()
    {
        troop.SpecialAbility();
    }

    void Update()
    {
        // Update button state based on cooldown if needed
    }
}

Висновок

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