Créer un jeu de type Clash of Clans dans Unity Pt. 3
Dans cette troisième partie de notre série de tutoriels, nous allons implémenter un système de combat permettant aux joueurs d'interagir avec d'autres joueurs ou l'IA. Cela comprend la gestion des interactions entre les troupes, la santé, les animations de combat et les mécanismes de combat en général.
Améliorer la classe des troupes
Nous devons améliorer la classe Troop existante pour mieux gérer le combat. Cela inclura le suivi de la santé et la gestion des attaques des joueurs et de l'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!");
}
}
}
Créer un gestionnaire de combat
Nous allons créer un CombatManager qui gérera les interactions entre les troupes, y compris la détection lorsque les troupes sont à portée d'attaque et la gestion de leurs cibles.
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
}
}
Mise en œuvre du comportement de l'IA
Pour rendre le combat plus engageant, nous pouvons implémenter un comportement d'IA de base pour les troupes ennemies.
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);
}
}
}
Créer des animations de combat
Pour améliorer l'attrait visuel du combat, nous pouvons ajouter des animations simples à nos troupes. Vous pouvez utiliser le composant Animator d'Unity pour configurer des animations d'attaque de base.
- Importez vos animations de troupes dans Unity.
- Dans la classe Troop, créez une variable publique Animator.
- Déclenchez l'animation pendant la méthode Attack.
public class Troop : MonoBehaviour
{
public Animator animator; // Add this line
private void Attack()
{
animator.SetTrigger("Attack"); // Trigger attack animation
// ... rest of the attack logic
}
}
Créer une interface de combat
Nous allons implémenter une interface utilisateur simple pour afficher les barres de santé des troupes et d'autres informations de combat pertinentes.
- Dans la Hiérarchie, créez une nouvelle UI > Canvas.
- Ajoutez des éléments UI > Image pour représenter les barres de santé de chaque troupe.
- Utilisez un script pour mettre à jour les barres de santé en fonction de la santé de la troupe.
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;
}
}
Conclusion
Dans ce didacticiel, nous avons ajouté un système de combat qui permet aux joueurs d'interagir avec d'autres joueurs ou avec l'IA. Nous avons implémenté des interactions entre les troupes, une gestion de la santé, des animations de combat et une interface utilisateur pour l'état de santé. Cela constitue la base d'une expérience de jeu plus interactive et stratégique dans votre jeu de type Clash of Clans.