기지에 도달하기
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은 짝을 이루므로, 각각의 +=에는 이에 대응하는 -=가 있어야 합니다.
챌린지
쉬움기지에는 생명이 필요하며, 기지에 도달한 적은 생명을 깎아야 합니다.
EnemyData에 공개 intdamage를 추가하세요. 이는 해당 종류의 적이 기지에서 깎는 생명 수입니다.Enemy에 적을 전달하는 공개 정적 이벤트ReachedBase(Action<Enemy>)를 선언하세요. 적이 마지막 웨이포인트에 도달하면 그 적 자신을 전달하여 이벤트를 발생시키고 적을 제거하세요. 그곳에서 멈추게 하지 마세요.GameManager에 직렬화된 intstartLives(20)와, 그 값으로 시작하는 private intlives를 추가하세요.OnEnable에서Enemy.ReachedBase를 구독하고OnDisable에서 구독을 해제하세요. 통과한 적은 각자의 에셋에 지정된damage만큼 생명을 깎습니다.- 직렬화된 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++;
}
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.