목표 찾기
Coddy의 Unity 게임: 타워 디펜스 코스 레슨. 18개 중 7번째.
타워는 적이 타워의 range 안에 있는 한 가장 가까운 적을 공격합니다. 대상을 선택하려면 타워는 보드에 있는 모든 적을 알아야 합니다. 타워마다 매 프레임 장면 전체에서 FindObjectsByType<Enemy>를 검색하는 대신, 적들은 자기 자신들의 목록을 유지합니다. Enemy 클래스의 정적 목록에 각 적이 OnEnable에서 추가되고 OnDisable에서 제거됩니다. Unity는 파괴되는 오브젝트에 OnDisable을 호출하므로, 죽은 적도 목록에서 제거됩니다. 게임의 픽업도 같은 방식으로 처리할 수 있습니다:
public class Pickup : MonoBehaviour
{
public static readonly List<Pickup> All = new List<Pickup>();
void OnEnable()
{
All.Add(this);
}
void OnDisable()
{
All.Remove(this);
}
}가장 가까운 대상을 찾는 것은 지금까지의 최선의 대상을 기억하는 반복문입니다. pullRange 안에서 가장 가까운 픽업을 끌어당기는 자석은 처음에 픽업이 없는 상태로 시작하고, 최선의 거리를 범위로 설정하므로 그보다 더 멀리 있는 픽업이 선택될 수 없습니다:
Pickup best = null;
float bestDistance = pullRange;
foreach (Pickup pickup in Pickup.All)
{
// 지금까지 가장 가까운 것보다 더 가까운가? 그렇다면 그것과 그 거리를 저장한다
}Vector3.Distance(a, b)는 두 점 사이의 거리를 반환합니다. 범위 안에 아무것도 없으면 반복문은 아무것도 선택하지 않으며, 결과는 null입니다.챌린지
중급Enemy에서 새 리스트인public static readonly List<Enemy> All을 추가합니다. 각 적은OnEnable에서 자신을 추가하고OnDisable에서 자신을 제거합니다.Tower에서 public floatrange(ArrowTower 프리팹은 4.5로 설정)와 private Enemytarget을 추가합니다.- 매 프레임
target을Enemy.All에 있는 적 중 타워에서 가장 가까우면서range안에 있는 적으로 설정합니다. 사정거리 안에 적이 없으면target은 null입니다.
아직 타워는 타깃을 대상으로 아무것도 하지 않습니다. 다음 수업에서는 타깃을 향하도록 회전시킵니다. Play를 누르고, 경로 옆에 타워를 건설한 다음 Check를 누르세요.
직접 해보기
using UnityEngine;
public class Tower : MonoBehaviour
{
public int cost = 50;
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.