Создание игры в стиле Clash of Clans в Unity. Часть 4
В этой четвертой части нашей серии обучающих материалов мы реализуем специальные способности для различных типов войск в нашей игре, похожей на Clash of Clans. Специальные способности добавляют глубину и стратегию игровому процессу, делая каждый отряд уникальным и более интересным.
Определение типов войск
Сначала давайте определим различные типы войск с соответствующими им способностями. Мы создадим базовый класс с именем Troop и выведем из него конкретные типы войск.
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...
}
Создание определенных типов войск
Теперь давайте создадим особые классы войск, которые наследуются от класса Troop, и реализуем их уникальные особые способности.
// 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!");
}
}
Активация специальных способностей
Нам нужен способ активировать специальные способности во время боя. Мы можем добавить метод в CombatManager, чтобы позволить войскам использовать свои способности.
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
}
}
Добавление перезарядки к специальным способностям
Чтобы предотвратить спам особыми способностями, мы можем добавить механизм восстановления для каждого типа войск.
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...
}
Создание пользовательского интерфейса для специальных возможностей
Полезно иметь элемент пользовательского интерфейса, который показывает, когда отряд может использовать свою особую способность. Вы можете создать простую кнопку пользовательского интерфейса для каждого отряда, которая активирует его способность.
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
}
}
Заключение
В этом уроке мы реализовали специальные способности для разных типов войск, улучшив стратегический игровой процесс в нашей игре, похожей на Clash of Clans. Создавая уникальные классы войск, активируя способности и управляя кулдаунами, мы можем предложить игрокам более динамичный боевой опыт.