Een Clash of Clans-achtig spel maken in Unity Pt. 3

In dit derde deel van onze tutorialserie implementeren we een gevechtssysteem waarmee spelers contact kunnen maken met andere spelers of AI. Dit omvat het beheren van troepeninteracties, gezondheid, gevechtsanimaties en de algemene gevechtsmechanica.

Verbetering van de troepenklasse

We moeten de bestaande Troop-klasse verbeteren om gevechten beter te kunnen verwerken. Dit omvat het bijhouden van gezondheid en het verwerken van aanvallen van zowel spelers als AI.

using UnityEngine;

public class Troop : MonoBehaviour
{
    public float movementSpeed = 2f;
    public int health = 50; // Added health property
    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()
    {
        // Attack the target
        Building building = target.GetComponent();
        if (building != null)
        {
            building.TakeDamage(damage);
            Debug.Log(name + " attacked " + target.name);
        }
    }

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

Een gevechtsmanager maken

We gaan een CombatManager maken die de interacties tussen troepen afhandelt, inclusief het detecteren wanneer troepen binnen bereik zijn om aan te vallen en het beheren van hun doelen.

using UnityEngine;
using System.Collections.Generic;

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

    void Update()
    {
        foreach (Troop troop in playerTroops)
        {
            FindTarget(troop, enemyTroops);
        }

        foreach (Troop troop in enemyTroops)
        {
            FindTarget(troop, playerTroops);
        }
    }

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

Implementatie van AI-gedrag

Om de strijd spannender te maken, kunnen we basis-AI-gedrag voor vijandelijke troepen implementeren.

public class EnemyAI : MonoBehaviour
{
    public float patrolRange = 5f;
    private Vector2 startPosition;

    void Start()
    {
        startPosition = transform.position;
    }

    void Update()
    {
        // Simple patrol logic
        transform.Translate(Vector2.right * Mathf.Sin(Time.time) * Time.deltaTime);

        // Check if the troop is in range to attack
        Troop troop = GetComponent();
        if (troop != null && troop.target == null)
        {
            // Find a new target
            CombatManager combatManager = FindObjectOfType();
            combatManager.FindTarget(troop, combatManager.playerTroops);
        }
    }
}

Het maken van gevechtsanimaties

Om de visuele aantrekkingskracht van gevechten te vergroten, kunnen we eenvoudige animaties aan onze troepen toevoegen. U kunt Unity's Animator-component gebruiken om basisaanvalsanimaties in te stellen.

  1. Importeer je troepenanimaties in Unity.
  2. Maak in de klasse Troop een openbare variabele Animator.
  3. Activeer de animatie tijdens de Aanval-methode.
public class Troop : MonoBehaviour
{
    public Animator animator; // Add this line

    private void Attack()
    {
        animator.SetTrigger("Attack"); // Trigger attack animation
        // ... rest of the attack logic
    }
}

Een Combat UI maken

We implementeren een eenvoudige gebruikersinterface om gezondheidsbalken voor troepen en andere relevante gevechtsinformatie weer te geven.

  1. Maak in de Hiërarchie een nieuwe UI > Canvas.
  2. Voeg UI > Image-elementen toe om de gezondheidsbalken voor elke troep weer te geven.
  3. Gebruik een script om de gezondheidsbalken bij te werken op basis van de gezondheid van de troepen.
using UnityEngine;
using UnityEngine.UI;

public class HealthBar : MonoBehaviour
{
    public Troop troop;
    public Image healthBar;

    void Update()
    {
        float healthPercentage = (float)troop.health / 50; // Assuming max health is 50
        healthBar.fillAmount = healthPercentage;
    }
}

Conclusie

In deze tutorial hebben we een gevechtssysteem toegevoegd waarmee spelers met andere spelers of AI kunnen interacteren. We hebben troepeninteracties, gezondheidsbeheer, gevechtsanimaties en UI voor gezondheidsstatus geïmplementeerd. Dit vormt de basis voor een interactievere en strategischere gameplay-ervaring in je Clash of Clans-achtige game.

Volgende stappen