Unity'de Clash of Clans benzeri bir oyun oluşturma Pt. 4

eğitim serimizin dördüncü bölümünde, Clash of Clans benzeri oyunumuzda farklı birlik türleri için özel yetenekler uygulayacağız. Özel yetenekler oyuna derinlik ve strateji katarak her birliği benzersiz ve daha ilgi çekici hale getirir.

Birlik Türlerinin Tanımlanması

Öncelikle, farklı birlik türlerini kendi yetenekleriyle tanımlayalım. Birlik adında bir temel sınıf oluşturacağız ve ondan belirli birlik türlerini türeteceğiz.

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

Belirli Birlik Türleri Oluşturma

Şimdi, Troop sınıfından miras alan ve onların benzersiz özel yeteneklerini uygulayan belirli birlik sınıfları oluşturalım.

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

Özel Yetenekleri Tetikleme

Savaş sırasında özel yetenekleri tetiklemenin bir yoluna ihtiyacımız var. Birliklerin yeteneklerini kullanmalarına izin vermek için CombatManager'e bir yöntem ekleyebiliriz.

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

Özel Yeteneklere Yeniden Kullanım Süreleri Ekleniyor

Özel yeteneklerin spamlanmasını önlemek için her birlik türüne bir soğuma mekanizması ekleyebiliriz.

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

Özel Yetenekler için Kullanıcı Arayüzü Oluşturma

Bir birliğin özel yeteneğini ne zaman kullanabileceğini gösteren bir kullanıcı arayüzü öğesine sahip olmak faydalıdır. Her bir birlik için yeteneklerini tetikleyen basit bir kullanıcı arayüzü düğmesi oluşturabilirsiniz.

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

Çözüm

Bu eğitimde, Clash of Clans benzeri oyunumuzda stratejik oynanışı geliştirerek farklı birlik türleri için özel yetenekler uyguladık. Benzersiz birlik sınıfları oluşturarak, yetenekleri tetikleyerek ve bekleme sürelerini yöneterek oyunculara daha dinamik savaş deneyimleri sunabiliyoruz.