Erstellen eines Clash of Clans-ähnlichen Spiels in Unity, Teil 3
In diesem dritten Teil unserer Tutorial-Reihe implementieren wir ein Kampfsystem, das es Spielern ermöglicht, mit anderen Spielern oder der KI zu interagieren. Dazu gehört die Verwaltung von Truppeninteraktionen, Gesundheit, Kampfanimationen und der allgemeinen Kampfmechanik.
Verbesserung der Truppenklasse
Wir müssen die bestehende Truppe-Klasse verbessern, um den Kampf besser zu bewältigen. Dazu gehört die Überwachung der Gesundheit und die Handhabung von Angriffen sowohl von Spielern als auch von KI.
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!");
}
}
}
Erstellen eines Combat Managers
Wir werden einen CombatManager erstellen, der die Interaktionen zwischen den Truppen handhabt. Er erkennt beispielsweise, wann sich Truppen in Angriffsreichweite befinden, und verwaltet ihre Ziele.
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
}
}
Implementierung von KI-Verhalten
Um den Kampf spannender zu gestalten, können wir grundlegendes KI-Verhalten für feindliche Truppen implementieren.
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);
}
}
}
Erstellen von Kampfanimationen
Um den visuellen Reiz des Kampfes zu steigern, können wir unseren Truppen einfache Animationen hinzufügen. Sie können die Animator-Komponente von Unity verwenden, um grundlegende Angriffsanimationen einzurichten.
- Importieren Sie Ihre Truppenanimationen in Unity.
- Erstellen Sie in der Klasse Troop eine öffentliche Variable Animator.
- Lösen Sie die Animation während der Methode Attack aus.
public class Troop : MonoBehaviour
{
public Animator animator; // Add this line
private void Attack()
{
animator.SetTrigger("Attack"); // Trigger attack animation
// ... rest of the attack logic
}
}
Erstellen einer Kampf-Benutzeroberfläche
Wir werden eine einfache Benutzeroberfläche implementieren, um Gesundheitsbalken für Truppen und andere relevante Kampfinformationen anzuzeigen.
- Erstellen Sie in der Hierarchie eine neue UI > Canvas.
- Fügen Sie UI > Image-Elemente hinzu, um die Gesundheitsbalken für jede Truppe darzustellen.
- Verwenden Sie ein Skript, um die Gesundheitsbalken basierend auf der Gesundheit der Truppe zu aktualisieren.
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;
}
}
Abschluss
In diesem Tutorial haben wir ein Kampfsystem hinzugefügt, das es Spielern ermöglicht, mit anderen Spielern oder der KI zu interagieren. Wir haben Truppeninteraktionen, Gesundheitsmanagement, Kampfanimationen und eine Benutzeroberfläche für den Gesundheitsstatus implementiert. Dies bildet die Grundlage für ein interaktiveres und strategischeres Spielerlebnis in Ihrem Clash of Clans-ähnlichen Spiel.