Menu
CoddyTech

기지에 도달하기

Coddy의 Unity 게임: 타워 디펜스 코스 레슨. 18개 중 3번째.

마지막 웨이포인트에 도달한 적은 기지에 도착한 것입니다. 플레이어는 목숨을 잃고 적은 사라집니다. 목숨은 화면에 표시하는 GameManager에 속합니다. 적이 이를 알리기 위해 GameManager에 대한 참조를 가질 필요는 없습니다. 곧 적은 프리팹에서 수십 개씩 생성될 것이고, 프리팹은 씬의 오브젝트를 가리킬 수 없기 때문입니다.

정적 이벤트는 이 두 가지 문제를 모두 해결합니다. 정적 이벤트는 적 하나가 아니라 Enemy 클래스에 속하므로 GameManager는 한 번만 구독하면 되고, 나중에 생성된 적을 포함해 모든 적의 알림을 받습니다. 각 적은 자기 자신을 인수로 전달해 이벤트를 발생시키므로, 리스너는 어떤 종류의 적이 통과했는지 확인할 수 있습니다. 플랫폼 게임의 코인도 같은 방식으로 알립니다.

public class Coin : MonoBehaviour
{
    public static event Action<Coin> Collected;
    public int value = 1;

    void OnTriggerEnter(Collider other)
    {
        Collected?.Invoke(this);
        Destroy(gameObject);
    }
}
// ScoreBoard.cs
void OnEnable()
{
    Coin.Collected += AddCoin;
}

void OnDisable()
{
    Coin.Collected -= AddCoin;
}

void AddCoin(Coin coin)
{
    score += coin.value;
}

정적 이벤트는 게임이 지속되는 동안 유지되므로 -=가 어느 때보다 중요합니다. 파괴된 ScoreBoard가 구독을 해제하지 않으면 계속 호출되고, 파괴된 텍스트에 접근하는 코드에서 오류가 발생합니다. OnEnable과 OnDisable은 짝을 이루므로, 각각의 +=에는 이에 대응하는 -=가 있어야 합니다.

challenge icon

챌린지

쉬움

기지에는 생명이 필요하며, 기지에 도달한 적은 생명을 깎아야 합니다.

  1. EnemyData에 공개 int damage를 추가하세요. 이는 해당 종류의 적이 기지에서 깎는 생명 수입니다.
  2. Enemy에 적을 전달하는 공개 정적 이벤트 ReachedBase (Action<Enemy>)를 선언하세요. 적이 마지막 웨이포인트에 도달하면 그 적 자신을 전달하여 이벤트를 발생시키고 적을 제거하세요. 그곳에서 멈추게 하지 마세요.
  3. GameManager에 직렬화된 int startLives (20)와, 그 값으로 시작하는 private int lives를 추가하세요. OnEnable에서 Enemy.ReachedBase를 구독하고 OnDisable에서 구독을 해제하세요. 통과한 적은 각자의 에셋에 지정된 damage만큼 생명을 깎습니다.
  4. 직렬화된 TMP_Text livesText에 생명 수를 Lives: 20 형식으로 표시하세요. 시작할 때와 생명 수가 바뀔 때마다 갱신하세요.

Game 오브젝트에는 GameManager가 있고, Inspector에서 LivesText를 연결했으며, 두 에셋 모두 생명 1을 깎도록 설정되어 있습니다. Play를 누르고 두 적이 기지에 도달할 때까지 기다린 다음 Check를 누르세요.

직접 해보기

using UnityEngine;

public class Enemy : MonoBehaviour
{
    public EnemyData data;
    public Transform[] waypoints;

    private int next = 1;
    private int health;

    void Awake()
    {
        health = data.maxHealth;
    }

    void Update()
    {
        if (next >= waypoints.Length)
        {
            return;
        }

        Vector3 target = waypoints[next].position;
        transform.position = Vector3.MoveTowards(transform.position, target, data.speed * Time.deltaTime);
        if (transform.position == target)
        {
            next++;
        }
    }
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

Unity 게임: 타워 디펜스의 모든 레슨