Skapa ett Clash of Clans-liknande spel i Unity Pt. 3
I den här tredje delen av vår tutorialserie kommer vi att implementera ett stridssystem för att göra det möjligt för spelare att engagera sig med andra spelare eller AI. Detta inkluderar hantering av truppinteraktioner, hälsa, stridsanimationer och den övergripande stridsmekaniken.
Förbättra truppklassen
Vi måste förbättra den befintliga Troop-klassen för att hantera strider bättre. Detta kommer att omfatta spårning av hälsa och hantering av attacker från både spelare och 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!");
}
}
}
Skapa en Combat Manager
Vi kommer att skapa en CombatManager som kommer att hantera interaktioner mellan trupper, inklusive att upptäcka när trupper är inom räckhåll för att attackera och hantera sina 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
}
}
Implementera AI-beteende
För att göra striden mer engagerande kan vi implementera grundläggande AI-beteende för fiendens trupper.
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);
}
}
}
Skapa stridsanimationer
För att förbättra stridens visuella dragningskraft kan vi lägga till enkla animationer till våra trupper. Du kan använda Unitys Animator-komponent för att ställa in grundläggande attackanimationer.
- Importera dina truppanimationer till Unity.
- I klassen Troop skapar du en offentlig variabel Animator.
- Aktivera animeringen 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
}
}
Skapa ett Combat UI
Vi kommer att implementera ett enkelt användargränssnitt för att visa hälsofält för trupper och annan relevant stridsinformation.
- I Hierarchy skapar du ett nytt UI > Canvas.
- Lägg till UI > Bild element för att representera hälsostaplar för varje trupp.
- Använd ett skript för att uppdatera hälsofälten baserat på truppens hälsa.
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;
}
}
Slutsats
I den här handledningen har vi lagt till ett stridssystem som låter spelare engagera sig med andra spelare eller AI. Vi implementerade truppinteraktioner, hälsohantering, stridsanimationer och användargränssnitt för hälsostatus. Detta utgör grunden för en mer interaktiv och strategisk spelupplevelse i ditt Clash of Clans-liknande spel.