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

In dit tweede deel van onze tutorialserie implementeren we troepenmechanica voor aanvallen en verdedigen in onze Clash of Clans-achtige game. We creëren troepeneenheden, beheren hun beweging en gedrag en laten spelers ze inzetten tijdens aanvallen.

Het opzetten van troepenprefabs

Eerst moeten we troepenprefabricaten maken die de verschillende eenheden in het spel vertegenwoordigen.

  1. Maak een nieuw GameObject voor je troep door met de rechtermuisknop te klikken in de Hiërarchie en 2D Object > Sprite te selecteren.
  2. Noem het Warrior en wijs er een sprite aan toe uit jouw assets.
  3. Voeg een nieuw script toe met de naam Troop om de troepenlogica te verwerken.
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);
    }
}

Een troepenmanager aanmaken

We gaan een troepenmanager creëren die de inzet van troepen regelt en de actieve troepen op het slagveld beheert.

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

Implementeren van het aanvalsmechanisme

Voor de aanval creëren we een basissysteem waarmee troepen gebouwen of andere eenheden kunnen aanvallen.

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

Troepen inzetten vanuit de gebruikersinterface

Vervolgens stellen we een eenvoudige UI-knop in om troepen te implementeren. Maak in het Canvas een knop en wijs de implementatiefunctie toe.

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

Vijandelijke verdediging toevoegen

Om het spel interactiever te maken, implementeren we verdedigingsmechanismen van de vijand die de troepen aanvallen.

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

Conclusie

In deze tutorial hebben we basistroepenmechanica geïmplementeerd voor aanvallen en verdedigen in onze Clash of Clans-achtige game. We hebben het gehad over troepeninzet, beweging, aanvalsgedrag en vijandelijke verdedigingen. Je kunt deze mechanica verder uitbreiden door troepentypen, speciale vaardigheden en complexere vijandelijke AI toe te voegen.

Volgende stappen