Создание игры в стиле Clash of Clans в Unity. Часть 3

В этой третьей части нашей серии обучающих материалов мы реализуем боевую систему, которая позволит игрокам взаимодействовать с другими игроками или ИИ. Это включает в себя управление взаимодействием войск, здоровьем, анимацией боя и общей механикой боя.

Улучшение класса войск

Нам нужно улучшить существующий класс Troop, чтобы лучше справляться с боем. Это будет включать отслеживание здоровья и обработку атак как от игроков, так и от ИИ.

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

Создание боевого менеджера

Мы создадим CombatManager, который будет управлять взаимодействием между войсками, включая определение того, находятся ли войска в зоне досягаемости для атаки, и управление их целями.

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

Реализация поведения ИИ

Чтобы сделать бой более захватывающим, мы можем реализовать базовое поведение ИИ для вражеских войск.

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

Создание боевых анимаций

Чтобы улучшить визуальную привлекательность боя, мы можем добавить простые анимации нашим войскам. Вы можете использовать компонент Unity Animator для настройки основных анимаций атак.

  1. Импортируйте анимацию ваших войск в Unity.
  2. В классе Troop создайте публичную переменную Animator.
  3. Запустите анимацию во время метода Атака.
public class Troop : MonoBehaviour
{
    public Animator animator; // Add this line

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

Создание боевого интерфейса

Мы реализуем простой пользовательский интерфейс для отображения полос здоровья войск и другой важной боевой информации.

  1. В Иерархии создайте новый UI > Холст.
  2. Добавьте элементы UI > Image для отображения полос здоровья каждого отряда.
  3. Используйте скрипт для обновления полосок здоровья на основе здоровья отряда.
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;
    }
}

Заключение

В этом руководстве мы добавили боевую систему, которая позволяет игрокам взаимодействовать с другими игроками или ИИ. Мы реализовали взаимодействие войск, управление здоровьем, анимацию боя и пользовательский интерфейс для состояния здоровья. Это формирует основу для более интерактивного и стратегического игрового процесса в вашей игре в стиле Clash of Clans.

Следующие шаги