Opret et Clash of Clans-lignende spil i Unity Pt. 3
I denne tredje del af vores tutorialserie implementerer vi et kampsystem, der gør det muligt for spillere at engagere sig med andre spillere eller AI. Dette inkluderer styring af troppeinteraktioner, sundhed, kampanimationer og den overordnede kampmekanik.
Forbedring af troppeklassen
Vi er nødt til at forbedre den eksisterende Troop klasse for at håndtere kampe bedre. Dette vil omfatte sporing af helbred og håndtering af angreb fra både spillere og 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!");
}
}
}
Oprettelse af en Combat Manager
Vi vil skabe en CombatManager, der vil håndtere interaktionerne mellem tropper, herunder at detektere, hvornår tropper er inden for rækkevidde til at angribe og styre deres mål.
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
}
}
Implementering af AI-adfærd
For at gøre kampen mere engagerende kan vi implementere grundlæggende AI-adfærd for fjendens tropper.
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);
}
}
}
Oprettelse af kampanimationer
For at forbedre kampens visuelle appel kan vi tilføje simple animationer til vores tropper. Du kan bruge Unitys Animator-komponent til at opsætte grundlæggende angrebsanimationer.
- Importer dine troppeanimationer til Unity.
- I Troop-klassen skal du oprette en offentlig Animator-variabel.
- Udløs animationen under Attack-metoden.
public class Troop : MonoBehaviour
{
public Animator animator; // Add this line
private void Attack()
{
animator.SetTrigger("Attack"); // Trigger attack animation
// ... rest of the attack logic
}
}
Oprettelse af en Combat UI
Vi vil implementere en simpel brugergrænseflade til at vise sundhedsbjælker for tropper og anden relevant kampinformation.
- I Hierarchy skal du oprette en ny UI > Canvas.
- Tilføj UI > Image elementer for at repræsentere sundhedsbjælker for hver troppe.
- Brug et script til at opdatere sundhedsbjælkerne baseret på troppens helbred.
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;
}
}
Konklusion
I denne tutorial har vi tilføjet et kampsystem, der giver spillere mulighed for at engagere sig med andre spillere eller AI. Vi implementerede troppeinteraktioner, sundhedsstyring, kampanimationer og brugergrænseflade for sundhedsstatus. Dette danner grundlaget for en mere interaktiv og strategisk spiloplevelse i dit Clash of Clans-lignende spil.