Criando um jogo semelhante ao Clash of Clans no Unity Pt. 3
Nesta terceira parte da nossa série de tutoriais, implementaremos um sistema de combate para permitir que os jogadores se envolvam com outros jogadores ou IA. Isso inclui gerenciar interações de tropas, saúde, animações de combate e a mecânica geral da batalha.
Melhorando a classe de tropa
Precisamos melhorar a classe Troop existente para lidar melhor com o combate. Isso incluirá rastrear a saúde e lidar com ataques de jogadores e IA.
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!");
}
}
}
Criando um gerente de combate
Criaremos um CombatManager que lidará com as interações entre as tropas, incluindo a detecção de quando as tropas estão no alcance para atacar e o gerenciamento de seus alvos.
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
}
}
Implementando o comportamento da IA
Para tornar o combate mais envolvente, podemos implementar comportamento básico de IA para tropas inimigas.
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);
}
}
}
Criando animações de batalha
Para melhorar o apelo visual do combate, podemos adicionar animações simples às nossas tropas. Você pode usar o componente Animator do Unity para configurar animações básicas de ataque.
- Importe suas animações de tropas para Unity.
- Na classe Troop, crie uma variável pública Animator.
- Acione a animação durante o método Ataque.
public class Troop : MonoBehaviour
{
public Animator animator; // Add this line
private void Attack()
{
animator.SetTrigger("Attack"); // Trigger attack animation
// ... rest of the attack logic
}
}
Criando uma IU de combate
Implementaremos uma interface de usuário simples para exibir barras de saúde das tropas e outras informações de combate relevantes.
- Na Hierarquia, crie uma nova UI > Canvas.
- Adicione elementos UI > Image para representar barras de saúde para cada tropa.
- Use um script para atualizar as barras de saúde com base na saúde da tropa.
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;
}
}
Conclusão
Neste tutorial, adicionamos um sistema de combate que permite que os jogadores se envolvam com outros jogadores ou IA. Implementamos interações de tropas, gerenciamento de saúde, animações de combate e UI para status de saúde. Isso forma a base para uma experiência de jogo mais interativa e estratégica em seu jogo do tipo Clash of Clans.