Skapa ett Clash of Clans-liknande spel i Unity Pt. 4

I den här fjärde delen av vår tutorialserie kommer vi att implementera speciella förmågor för olika trupptyper i vårt Clash of Clans-liknande spel. Särskilda förmågor ger djup och strategi till spelet, vilket gör varje trupp unik och mer engagerande.

Definiera trupptyper

Låt oss först definiera olika trupptyper med deras respektive förmågor. Vi skapar en basklass som heter Trupp och härleder specifika trupptyper från den.

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

Skapa specifika trupptyper

Låt oss nu skapa specifika truppklasser som ärver från Troop-klassen och implementera deras unika specialförmågor.

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

Utlöser speciella förmågor

Vi behöver ett sätt att utlösa speciella förmågor under strid. Vi kan lägga till en metod i CombatManager för att tillåta trupper att använda sina förmågor.

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

Lägga till nedkylningar till speciella förmågor

För att förhindra att spamma speciella förmågor kan vi lägga till en nedkylningsmekanism till varje trupptyp.

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

Skapa användargränssnitt för speciella förmågor

Det är användbart att ha ett UI-element som visar när en trupp kan använda sin speciella förmåga. Du kan skapa en enkel UI-knapp för varje trupp som utlöser deras förmåga.

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

Slutsats

I den här handledningen implementerade vi speciella förmågor för olika trupptyper, vilket förbättrade det strategiska spelet i vårt Clash of Clans-liknande spel. Genom att skapa unika truppklasser, utlösa förmågor och hantera nedkylningar kan vi erbjuda spelarna mer dynamiska stridsupplevelser.