Creare un gioco simile a Clash of Clans in Unity Pt. 3
In questa terza parte della nostra serie di tutorial, implementeremo un sistema di combattimento per consentire ai giocatori di interagire con altri giocatori o con l'IA. Ciò include la gestione delle interazioni delle truppe, della salute, delle animazioni di combattimento e delle meccaniche di battaglia generali.
Migliorare la classe delle truppe
Dobbiamo potenziare la classe Troop esistente per gestire meglio il combattimento. Ciò includerà il monitoraggio della salute e la gestione degli attacchi sia dei giocatori che dell'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!");
}
}
}
Creazione di un gestore di combattimento
Creeremo un CombatManager che gestirà le interazioni tra le truppe, tra cui il rilevamento della loro posizione a tiro per attaccare e la gestione dei loro obiettivi.
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
}
}
Implementazione del comportamento dell'IA
Per rendere il combattimento più coinvolgente, possiamo implementare un comportamento di base dell'IA per le truppe nemiche.
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);
}
}
}
Creazione di animazioni di battaglia
Per migliorare l'attrattiva visiva del combattimento, possiamo aggiungere semplici animazioni alle nostre truppe. Puoi usare il componente Animator di Unity per impostare animazioni di attacco di base.
- Importa le animazioni delle tue truppe in Unity.
- Nella classe Troop, crea una variabile pubblica Animator.
- Attiva l'animazione durante il metodo Attacco.
public class Troop : MonoBehaviour
{
public Animator animator; // Add this line
private void Attack()
{
animator.SetTrigger("Attack"); // Trigger attack animation
// ... rest of the attack logic
}
}
Creazione di un'interfaccia utente di combattimento
Implementeremo un'interfaccia utente semplice per visualizzare le barre della salute delle truppe e altre informazioni rilevanti sul combattimento.
- Nella Gerarchia, crea una nuova UI > Canvas.
- Aggiungi gli elementi UI > Immagine per rappresentare le barre della salute per ogni truppa.
- Utilizza uno script per aggiornare le barre della salute in base alla salute della truppa.
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;
}
}
Conclusione
In questo tutorial, abbiamo aggiunto un sistema di combattimento che consente ai giocatori di interagire con altri giocatori o con l'IA. Abbiamo implementato interazioni tra truppe, gestione della salute, animazioni di combattimento e UI per lo stato di salute. Ciò costituisce la base per un'esperienza di gioco più interattiva e strategica nel tuo gioco simile a Clash of Clans.