Unity에서 Clash of Clans와 유사한 게임 만들기 3부

튜토리얼 시리즈의 세 번째 부분에서는 플레이어가 다른 플레이어나 AI와 교류할 수 있는 전투 시스템을 구현합니다. 여기에는 군대 상호 작용, 체력, 전투 애니메이션 및 전반적인 전투 메커니즘 관리가 포함됩니다.

병력 계급 강화

우리는 전투를 더 잘 처리하기 위해 기존의 Troop 클래스를 강화해야 합니다. 여기에는 체력 추적과 플레이어와 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!");
        }
    }
}

전투 관리자 만들기

부대 간의 상호작용을 처리하고 부대가 공격 범위에 들어왔는지 감지하고 표적을 관리하는 등의 기능을 담당하는 CombatManager를 만들 것입니다.

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
    }
}

AI 행동 구현

전투를 더욱 매력적으로 만들기 위해 적군에 대한 기본적인 AI 행동을 구현할 수 있습니다.

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);
        }
    }
}

전투 애니메이션 만들기

전투의 시각적 매력을 강화하기 위해, 우리는 군대에 간단한 애니메이션을 추가할 수 있습니다. Unity의 Animator 구성 요소를 사용하여 기본 공격 애니메이션을 설정할 수 있습니다.

  1. 군대 애니메이션을 Unity로 가져오세요.
  2. Troop 클래스에서 공개 Animator 변수를 만듭니다.
  3. 공격 메서드 중에 애니메이션을 트리거합니다.
public class Troop : MonoBehaviour
{
    public Animator animator; // Add this line

    private void Attack()
    {
        animator.SetTrigger("Attack"); // Trigger attack animation
        // ... rest of the attack logic
    }
}

전투 UI 만들기

우리는 부대의 체력 막대와 기타 관련 전투 정보를 표시하는 간단한 UI를 구현할 것입니다.

  1. Hierarchy에서 새 UI > Canvas를 만듭니다.
  2. 각 부대의 체력 막대를 나타내기 위해 UI > Image 요소를 추가합니다.
  3. 스크립트를 사용해 부대의 체력에 따라 체력 막대를 업데이트합니다.
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;
    }
}

결론

이 튜토리얼에서는 플레이어가 다른 플레이어나 AI와 교류할 수 있는 전투 시스템을 추가했습니다. 우리는 군대 상호작용, 체력 관리, 전투 애니메이션, 체력 상태 UI를 구현했습니다. 이는 Clash of Clans와 같은 게임에서 보다 상호 작용적이고 전략적인 게임플레이 경험을 위한 기반을 형성합니다.

다음 단계