Tạo một trò chơi giống Clash of Clans trong Unity Pt. 3
Trong phần thứ ba của chuỗi hướng dẫn này, chúng tôi sẽ triển khai một hệ thống chiến đấu cho phép người chơi tương tác với những người chơi khác hoặc AI. Điều này bao gồm quản lý tương tác quân lính, sức khỏe, hoạt ảnh chiến đấu và cơ chế chiến đấu tổng thể.
Tăng cường lớp quân đội
Chúng tôi cần cải thiện lớp Troop hiện có để xử lý chiến đấu tốt hơn. Điều này sẽ bao gồm theo dõi sức khỏe và xử lý các cuộc tấn công từ cả người chơi và 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!");
}
}
}
Tạo Trình quản lý chiến đấu
Chúng tôi sẽ tạo một CombatManager để xử lý các tương tác giữa các quân, bao gồm phát hiện thời điểm quân ở trong phạm vi tấn công và quản lý mục tiêu của họ.
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
}
}
Triển khai hành vi AI
Để khiến cuộc chiến trở nên hấp dẫn hơn, chúng ta có thể triển khai hành vi AI cơ bản cho quân địch.
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);
}
}
}
Tạo hoạt ảnh chiến đấu
Để tăng cường sức hấp dẫn trực quan của chiến đấu, chúng ta có thể thêm hoạt ảnh đơn giản vào quân lính của mình. Bạn có thể sử dụng thành phần Animator của Unity để thiết lập hoạt ảnh tấn công cơ bản.
- Nhập hoạt ảnh quân đội của bạn vào Unity.
- Trong lớp Troop, hãy tạo một biến Animator công khai.
- Kích hoạt hoạt ảnh trong phương thức Tấn công.
public class Troop : MonoBehaviour
{
public Animator animator; // Add this line
private void Attack()
{
animator.SetTrigger("Attack"); // Trigger attack animation
// ... rest of the attack logic
}
}
Tạo giao diện chiến đấu
Chúng tôi sẽ triển khai một giao diện người dùng đơn giản để hiển thị thanh máu của quân lính và các thông tin chiến đấu có liên quan khác.
- Trong Hierarchy, hãy tạo một UI > Canvas mới.
- Thêm các phần tử UI > Image để biểu diễn thanh máu của từng quân.
- Sử dụng tập lệnh để cập nhật thanh máu dựa trên lượng máu của quâ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;
}
}
Phần kết luận
Trong hướng dẫn này, chúng tôi đã thêm một hệ thống chiến đấu cho phép người chơi tương tác với những người chơi khác hoặc AI. Chúng tôi đã triển khai tương tác quân đội, quản lý sức khỏe, hoạt ảnh chiến đấu và giao diện người dùng cho trạng thái sức khỏe. Điều này tạo thành cơ sở cho trải nghiệm chơi trò chơi tương tác và chiến lược hơn trong trò chơi giống Clash of Clans của bạn.