Unity'de Clash of Clans benzeri bir oyun oluşturma Pt. 3
eğitim serimizin bu üçüncü bölümünde, oyuncuların diğer oyuncularla veya yapay zekayla etkileşime girmesini sağlayacak bir savaş sistemi uygulayacağız. Bu, birlik etkileşimlerini, sağlığı, savaş animasyonlarını ve genel savaş mekaniklerini yönetmeyi içerir.
Birlik Sınıfını Geliştirmek
Mevcut Troop sınıfını muharebeyi daha iyi idare edecek şekilde geliştirmemiz gerekiyor. Bu, hem oyuncuların hem de yapay zekanın sağlığını takip etmeyi ve saldırılarını yönetmeyi içerecek.
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!");
}
}
}
Bir Muharebe Yöneticisi Oluşturma
Birlikler arasındaki etkileşimleri yönetecek, birliklerin saldırı menziline girdiğini tespit edecek ve hedeflerini yönetecek bir CombatManager oluşturacağız.
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
}
}
Yapay Zeka Davranışını Uygulama
Savaşı daha ilgi çekici hale getirmek için düşman birliklerine yönelik temel yapay zeka davranışlarını uygulayabiliriz.
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);
}
}
}
Savaş Animasyonları Oluşturma
Muharebenin görsel çekiciliğini artırmak için birliklerimize basit animasyonlar ekleyebiliriz. Temel saldırı animasyonlarını ayarlamak için Unity'nin Animator bileşenini kullanabilirsiniz.
- Birlik animasyonlarınızı Unity'a aktarın.
- Troop sınıfında, public bir Animator değişkeni oluşturun.
- Attack metodu sırasında animasyonu tetikle.
public class Troop : MonoBehaviour
{
public Animator animator; // Add this line
private void Attack()
{
animator.SetTrigger("Attack"); // Trigger attack animation
// ... rest of the attack logic
}
}
Bir Savaş Kullanıcı Arayüzü Oluşturma
Birliklerin sağlık çubuklarını ve diğer ilgili muharebe bilgilerini görüntüleyen basit bir kullanıcı arayüzü uygulayacağız.
- Hierarchy'de yeni bir UI > Canvas oluşturun.
- Her birliğin sağlık çubuklarını temsil etmek için UI > Image öğelerini ekleyin.
- Birliğin sağlığına bağlı olarak sağlık çubuklarını güncellemek için bir komut dosyası kullanın.
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;
}
}
Çözüm
Bu eğitimde, oyuncuların diğer oyuncularla veya yapay zekayla etkileşime girmesine olanak tanıyan bir savaş sistemi ekledik. Birlik etkileşimleri, sağlık yönetimi, savaş animasyonları ve sağlık durumu için kullanıcı arayüzü uyguladık. Bu, Clash of Clans benzeri oyununuzda daha etkileşimli ve stratejik bir oyun deneyiminin temelini oluşturur.