Tworzenie gry podobnej do Clash of Clans w Unity Pt. 3

W tej trzeciej części naszego serii samouczków wdrożymy system walki, aby umożliwić graczom interakcję z innymi graczami lub SI. Obejmuje to zarządzanie interakcjami wojsk, zdrowiem, animacjami walki i ogólną mechaniką bitwy.

Ulepszanie klasy oddziałów

Musimy ulepszyć istniejącą klasę Troop, aby lepiej radziła sobie z walką. Będzie to obejmować śledzenie zdrowia i radzenie sobie z atakami zarówno graczy, jak i 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!");
        }
    }
}

Tworzenie menedżera walki

Stworzymy CombatManager, który będzie obsługiwał interakcje między wojskami, m.in. wykrywał, kiedy wojska znajdują się w zasięgu ataku, i zarządzał swoimi celami.

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

Wdrażanie zachowań AI

Aby walka była bardziej wciągająca, możemy zaimplementować podstawowe zachowania sztucznej inteligencji wobec żołnierzy wroga.

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

Tworzenie animacji bitewnych

Aby zwiększyć atrakcyjność wizualną walki, możemy dodać proste animacje do naszych oddziałów. Możesz użyć komponentu Animator Unity, aby skonfigurować podstawowe animacje ataku.

  1. Importuj animacje swoich wojsk do Unity.
  2. W klasie Troop utwórz publiczną zmienną Animator.
  3. Wyzwól animację podczas metody Atak.
public class Troop : MonoBehaviour
{
    public Animator animator; // Add this line

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

Tworzenie interfejsu użytkownika walki

Wprowadzimy prosty interfejs użytkownika wyświetlający paski zdrowia żołnierzy i inne istotne informacje dotyczące walki.

  1. W hierarchii utwórz nowy interfejs użytkownika > Canvas.
  2. Dodaj elementy UI > Image reprezentujące paski zdrowia każdego oddziału.
  3. Użyj skryptu, aby zaktualizować paski zdrowia na podstawie stanu zdrowia oddziału.
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;
    }
}

Wniosek

W tym samouczku dodaliśmy system walki, który pozwala graczom na interakcję z innymi graczami lub AI. Wdrożyliśmy interakcje wojsk, zarządzanie zdrowiem, animacje walki i interfejs użytkownika dla stanu zdrowia. Stanowi to podstawę bardziej interaktywnego i strategicznego doświadczenia rozgrywki w grze podobnej do Clash of Clans.

Następne kroki