목표 찾기
Coddy의 Unity 게임: 타워 디펜스 코스 레슨. 25개 중 8번째.
타워는 적이 타워의 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 = new List<Enemy>();를 추가하고,OnEnable에서this를 추가하고OnDisable에서 제거합니다.Tower에서public float range = 4f;와private Enemy target;를 추가합니다.- 매 프레임마다
Enemy.All에서range안에 있는 가장 가까운 적을 찾습니다(없으면 null). 새 적이면"Target: " + found.name을 로그에 출력하고, 해당 적을target에 저장합니다.
‘플레이’를 누르고 경로 옆에 타워를 건설하세요. Console에 새 대상의 이름이 표시됩니다. 그런 다음 ‘확인’을 누르세요.
직접 해보기
using UnityEngine;
// 나중에 구현: 타워가 사거리 안의 적을 찾아 그쪽으로 돌아서 발사합니다.
public class Tower : MonoBehaviour
{
}
Unity 게임: 타워 디펜스의 모든 레슨
직접 연습해 보세요: Unity 플레이그라운드