Crearea unui joc asemănător Clash of Clans în Unity Pt. 3
În această a treia parte a seria noastră de tutoriale, vom implementa un sistem de luptă pentru a le permite jucătorilor să interacționeze cu alți jucători sau cu AI. Aceasta include gestionarea interacțiunilor cu trupele, a sănătății, a animațiilor de luptă și a mecanicii generale de luptă.
Îmbunătățirea clasei de trupe
Trebuie să îmbunătățim clasa existentă Troop pentru a gestiona mai bine lupta. Aceasta va include urmărirea sănătății și gestionarea atacurilor atât de la jucători, cât și de la AI.
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!");
}
}
}
Crearea unui manager de luptă
Vom crea un CombatManager care se va ocupa de interacțiunile dintre trupe, inclusiv detectarea când trupele sunt în raza de acțiune pentru a ataca și gestionarea țintelor lor.
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
}
}
Implementarea comportamentului AI
Pentru a face lupta mai antrenantă, putem implementa un comportament AI de bază pentru trupele inamice.
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);
}
}
}
Crearea de animații de luptă
Pentru a spori atractivitatea vizuală a luptei, putem adăuga animații simple trupelor noastre. Puteți utiliza componenta Unity Animator pentru a configura animații de atac de bază.
- Importați animațiile trupelor dvs. în Unity.
- În clasa Troop, creați o variabilă publică Animator.
- Declanșează animația în timpul metodei 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
}
}
Crearea unei interfețe de utilizare de luptă
Vom implementa o interfață simplă pentru a afișa barele de sănătate pentru trupe și alte informații relevante de luptă.
- În Ierarhia, creați un nou UI > Canvas.
- Adăugați elemente UI > Imagine pentru a reprezenta barele de sănătate pentru fiecare trupă.
- Utilizați un script pentru a actualiza barele de sănătate în funcție de sănătatea trupei.
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;
}
}
Concluzie
În acest tutorial, am adăugat un sistem de luptă care permite jucătorilor să interacționeze cu alți jucători sau cu AI. Am implementat interacțiuni cu trupele, managementul sănătății, animații de luptă și UI pentru starea de sănătate. Aceasta formează baza pentru o experiență de joc mai interactivă și mai strategică în jocul tău asemănător Clash of Clans.